s1 segment stack
dw 100h dup(?)
top label word
s1 ends
s2 segment
score dw 76,69,84,90,73,88,99,63,100,80,'$'
s6 dw 0,'$'
s7 dw 0,'$'
s8 dw 0,'$'
s9 dw 0,'$'
s10 dw 0,'$'
s2 ends
s3 segment
assume cs:s3,ds:s2,ss:s3
main proc far
mov ax,s1
mov ss,ax
lea sp,top
mov ax,s2
mov ds,ax
mov si,0
repeat: cmp si,20
jz exit
mov ax,score[si]
cmp ax,100
jnz l
mov bx,s10[0]
inc bx
mov s10[0],bx
jmp l5 ;必须跳转到si加二那里
l: cmp ax,90
jb l2
mov bx,s9[0]
inc bx
mov s9[0],bx
jmp l5
l2: cmp ax,80
jb l3
mov bx,s8[0]
inc bx
mov s8[0],bx
jmp l5
l3: cmp ax,70
jb l4
mov bx,s7[0]
inc bx
mov s7[0],bx
jmp l5
l4: mov bx,s6[0]
inc bx
mov s6[0],bx
l5: add si,2
jmp repeat
exit: mov ah,4ch
int 21h
main endp
s3 ends
end main
有10个学生成绩;编写程序统计60-69分,70-79分,80-89分,90-99分和100分的人数,分别放到S6,S7,S8,S9,S10单元中;
成绩:76,69,84,90,73,88,99,63,100,80
手工统计:
60-69分:2
70-79分:2
80-89分:3
90-99分:2
100分:1
下面在emu8086中运行程序来验证;
程序放入emu8086;
点击 emulate;出来运行界面;在original source code 窗口,鼠标选择第54行;对应 emulator 窗口中,仿真内存窗口,自己定位到07395地址处;这是这行代码在8086内存中的位置;
从 debug 菜单选择 run until(07395h);
运行到07395断住;此时统计已完成;
在 original source code 窗口,选中07行, 这是自己定义的内存单元 s6;s6到s10是四字节单元;把仿真内存窗口拉长,一次可看到五个结果;
从07316到07319,这是s6单元;07326开始是s10单元;看这五个内存单元内容,存的是 2 2 3 2 1; 和手工统计结果一样;
程序中 cmp ax,90,,,cmp ax 80,,, 这些就是判断一个成绩是否在某个段;每次bx加1来存储在此段的个数;
mov ax,score[si]
每次是把score中的数放一个到ax,然后判断;