求平均成绩
在下面的数据段中,给出了全班3名同学OS、AL、SE、DB课程的成绩,请编程计算出平均成绩,写在 ? 处。
datasg segment
db '201558501111','MMTJAB ',90,100,76,89,?
db '201558501112','ZhangAP ',97,82,79,88,?
db '201558501113','ShaoXL ',77,98,89,91,?
db 4 ;这是课程门数,将要用于作除数,偏移量为75
datasg ends
参考解答:
assume cs:codesg,ds:datasg, ss:stacksg
datasg segment
db '201558501111','MMTJAB ',90,100,76,89,?
db '201558501112','ZhangAP ',97,82,79,88,?
db '201558501113','ShaoXL ',77,98,89,91,?
db 4 ;这是课程门数,将要用于作除数,偏移量为75
datasg ends
stacksg segment stack
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start: mov ax, stacksg
mov ss, ax
mov sp, 16
mov ax, datasg
mov ds, ax
mov bp, 0 ;基址,bx想用于数据处理了
mov cx, 4 ;外层循环次数
s0: push cx ;保存外层循环数
mov si, 0 ;ds:[bp+si+20]将是要处理的数值,第一科成绩前有20个字节是学号、姓名
mov cx, 4 ;设置内层循环次数
mov ax, 0 ;用于存储累加和,因为4门课总成绩可能会大于256,故用字
s: mov bl, ds:[bp+si+20] ;取成绩,100以内,用字节数据
mov bh, 0 ;为下面一步用字进行加法准备
add ax, bx ;累加总分
add si, 1 ;取下一字节
loop s
div byte ptr ds:[75] ;求均分
mov ds:[bp+si+20], al ;保存均分
add bp, 25 ;下一位同学成绩的基址
pop cx ;恢复外层循环
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
注:在这个程序里,数据存储相当于C语言的结构体(由此体会汇编语言其实也是很强大的!)
struct Student{
char num[12];
char name[8];
char OS;
char AL;
char SE;
char DB;
char aver;
};
struct Student stu[77];