21,500
社区成员
发帖
与我相关
我的任务
分享;数据文件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 ; 程序结束