16位汇编文件操作。。。。。。

wxgiter 2009-04-05 06:23:07
;数据文件student.dat中依次存放着30个学生的成绩记录,文件(成绩)记录具有如下字段:
; 学号 整数 2字节
; 姓名 字符串 8字节
; 语文成绩 整数 1字节
; 数学成绩 整数 1字节
; 外语成绩 整数 1字节
;写一上程序计算三门课的总分,把学号和总分依次写到文件student.sum中.student.sum文件的记录有两
;个字段,第一个字段是学号,第二个字段是总分(用2个字节表示)
;//////////////////////////////////////////////////////////////////
;程序名:T7-1.asm
;作者:
;完成日期:
;功能:数据文件student.dat中依次存放30个学生成绩记录,
; 计算3门课的总分,把学号和总分依次写到文件 student.sum中
;程序说明:为了突出结构的应用,下面列出的程序没有考虑磁盘文件读写出错的情况
;程序流程:1.打开文件student.dat; 2.循环处理每个学生的成绩,把学号和总分依次存入预定义的缓冲区(称为总分表)中;
; 3.关闭文件student.dat 4.建立文件student.sum ;5.把缓冲区内容写入文件student.sum 中
; 6.关闭文件 student.sum
;//////////////////////////////////////////////////////////////////
;常量定义
COUNT=30 ;设学生数为30

;对应原始成绩的结构student的定义(数据在student.dat文件中)
student struc
Stu_Num dw ? ;学号
Stu_name db 8 dup (' ') ;姓名
china db 0 ;语文成绩
math db 0 ;数学成绩
english db 0 ;英语成绩
student ends
;对应学号和总分的结构item的定义
item struc
Stu_Nums dw 0 ;学号
Stu_scores dw 0 ;总分
item ends

; 数据段
DSEG SEGMENT ;定义数据段
;TO DO:数据添加到下面
;//////////////////////////////////////////////////////////////

buffer student <> ;存放原始成绩的缓冲区
stable item count dup(<>) ;预留总分表(用来存放学号和总分缓冲区的结构数据)
fname_dat db 'student.dat',0 ;文件名//在DOS磁盘文件管理功能调用中,用于表示文件名的ASCII字符
fname_sum db 'student.sum',0 ;串必须以ASCII码值0结尾(不是数字符号0),文件名可以包含盘符路径
DSEG ENDS


; 堆栈段
SSEG SEGMENT STACK ;定义堆栈段

DB 100H DUP(?) ;设置堆栈段大小为100H

SSEG ENDS

; 代码段
CSEG SEGMENT ;定义代码段

ASSUME CS:CSEG, DS:DSEG, SS:SSEG ;关联段寄存器

START: ;主程序入口点
;TO DO:添加主程序代码
; ------------------------------------------------------
mov ax,dseg
mov ds,ax
mov dx,offset fname_dat
mov ax,3d00h ;以只读方式打开文件student.dat;
int 21h

mov bx,ax ;出口参数传到入口参数
mov di,count ;置循环初值
mov si,offset stable;指针初值指向学号总分缓冲区
;读一个学生的原始成绩
read: mov dx,offset buffer;从student.dat中读一个学生的原始成绩,并写入buffer缓冲区
mov cx,type student ;?type 析值操作符
mov ah,3fh ;3f功能调用读文件
int 21h

;统计总分
mov al,buffer.china ;统计总分,总分放ax
xor ah,ah
add al,buffer.math
adc ah,0
add al,buffer.english
adc ah,0

;把总分保存到总分表的当前项
mov [si].Stu_scores,ax
mov ax,buffer.Stu_Num
;把学号保存到总表的当前项
mov [si].Stu_Nums,ax
add si,type item ;调整当前总分表当前项
dec di
jnz read ;循环,读下一个学生信息
mov ah,3eh ;关闭文件student.dat
int 21h

;建立文件student.sum
mov dx,offset fname_sum
mov cx,0
mov ah,3ch
int 21h

mov bx,ax
mov dx,offset stable ;写出学号和总分
mov cx,(type item)*count ;?
mov ah,40h ;40H号功能调用
int 21h

mov ah,3eh ;关闭文件student.sum
int 21h
;-------------------------------------------------------
; 退出 DOS
MOV AX, 4C00H ;返回DOS系统
INT 21H

CSEG ENDS
;TO DO: 添加其他段 [可选]
;///////////////////////////////////////////////////////////////

END START ; 程序结束


代码如上,我想知道student.dat里面的内容到底该是什么,才能使程序正常运行,希望高手解答。。。。

非常感谢~~
...全文
459 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyilun526 2011-05-12
  • 打赏
  • 举报
回复
能给个数据文件的样例吗
我文件中
2009
xiaoming
98
87
88
结果不行
wxgiter 2009-04-05
  • 打赏
  • 举报
回复
我用winhex编写了输入文件,输出结果与预期的不符,原来输出文件也要用二进制看的,呵呵

当时晕了。。非常感谢啊!!!!
小赌移情 2009-04-05
  • 打赏
  • 举报
回复
;数据文件student.dat中依次存放着30个学生的成绩记录,文件(成绩)记录具有如下字段:
; 学号 整数 2字节
; 姓名 字符串 8字节
; 语文成绩 整数 1字节
; 数学成绩 整数 1字节
; 外语成绩 整数 1字节

這個不是提示嗎, 你用一個hex文件編輯器自己編輯個試試沒有?

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧