求平均成绩
在下面的数据段中,给出了全班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];