定义一个班级的成绩数组,数组长度N>=15。统计其中优秀[100,90]、良好[89,80] 、中等[79,70] 、及格[69,60] 、不及格[59,0]的人数,分别存于A_NUM、 B_NUM、 C_NUM、 D_NUM、 E_NUM中。
要求各个分数段都有人员分布
assume cs:code
data segment
db 22,33,44,55,66,77,88,99,11,78,69,98,87,85,96,45
a_num db 0
b_num db 0
c_num db 0
d_num db 0
e_num db 0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,16
s:
mov al,[si]
cmp al,90
jnb sa
cmp al,80
jnb sb
cmp al,70
jnb sc
cmp al,60
jnb sd
inc e_num[0]
jmp short ok
sa:inc a_num[0]
jmp short ok
sb:inc b_num[0]
jmp short ok
sc:inc c_num[0]
jmp short ok
sd:inc d_num[0]
ok:inc si
loop s
mov ax,4c00h
int 21
code ends
end start
该程序assume中没有添加ds:data,不能编译(我添加后是可以的)
以下程序也没有添加,却能编译(不同的题目代码)
希望能够解答,这其中的差异是什么,是什么原因导致的,嘻嘻,最好最后附带assume的具体用法
3.数值显示(将data段中的数据以十进制的形式显示出来)
assume cs:code
data segment
dw 123,12666,1,8,3,38
data ends
string segment
db 6 dup (0)
string ends
code segment
start:
mov cx,6 ;六个数据,循环六次
mov ax,data
mov ds,ax
mov bx,0
mov dh,8
s:
push cx
push ds ;循环体内用到cx,ds压栈保护
mov ax,[bx]
call dtoc
mov dl,3
mov cl,2
mov ax,string
mov ds,ax
call show_str
inc dh
add bx,2
pop ds
pop cx
loop s
mov ax,4c00h
int 21h
dtoc:
push ax
push cx
push dx
push bx
push es
push di ;压栈保护
mov bx,string
mov es,bx
mov di,5
mov si,di
go:
mov dx,0
mov bx,10
div bx ;用32位除 16位 ax存商 dx余数
add dx,48
mov es:[di],dl
dec di ;将余数转ASCII码值
mov cl,al
mov ch,0
jcxz ok1 ;判断商是否为0,是0则返回
mov si,di
jmp short go
ok1:
pop di
pop es
pop bx
pop dx
pop cx
pop ax
ret ;出栈,返回
show_str:
push ax
push es
push dx
push bx
push di
push si
push cx ;压栈保护现场
mov ax,0b800h
mov es,ax
mov al,160
dec dh
mul dh ;一行160字节,7*160即从第八行开始
add dl,dl
sub dl,2
mov bl,dl
mov bh,0
add ax,bx
mov di,ax ;解决di在屏幕上的位置,行数+列数的和
mov dl,cl ;因为下面要判断字符是否为零,需要cx,所以先用dl保存cl 的颜色数据
mov ch,0
okk:
mov cl,[si]
mov es:[di],cl
jcxz ok ;字符为零,转到ok出栈结束程序
mov es:[di+1],dl
inc si
add di,2
jmp short okk ;跳转,继续下一字符的判断
ok:
pop cx
pop si
pop di
pop bx
pop dx
pop es
pop ax ;出栈
ret
code ends
end start
|