汇编初学者的初级问题,求好心人指点
datarea segment
grade dw 88,75,95,63,98,78,87,73,90,60
rank dw 10 dup(?)
[1]//view dw 10 dup(?)
datarea ends
prognam segment
main proc far
assume cs : prognam,ds :datarea
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov di,10
mov bx,0
loop1:
mov ax,grade[bx]
mov dx,0
mov cx,10
lea si,grade
next:
cmp ax,[si]
jg no_count
inc dx
no_count:
add si,2
loop next
mov rank[bx],dx
add bx,2
[2]//mov si,dx
[3]//mov view[si],ax
dec di
jne loop1
[4]//mov di,10
[5] //GO:
[6]//mov si,11
[7]//sub si,di
[8]//mov ax,view[si]
[9]//mov bl,10
[10]//div bl
[11]//mov dh,al
[12]//add dh,30h
[13]//mov dl,dh
[14]//mov ah,02h
[15]//int 21h
[16]//mov dh,ah
[17]//add dh,30h
[18]//mov dl,dh
[19]//mov ah,02h
[20]//int 21h
[21]//dec di
[22]//loopnz GO
ret
main endp
prognam ends
end start
高手帮忙啊``我很不通。。这原本是一个按已给成绩得出每个成绩的排名的程序(前没加//部分为原来的程序),然后要在原来程序的基础上增加一个功能,就是让它按排名先后顺序依次输出成绩。。然后那些前有//的代码是我自己加的,我的意思是想另外用一个数组利用rank数组里的内容来按顺序存放已经排好序的成绩,然后再从这个数组依次输出。。但是最后运行貌似是溢出,我是初学这,编程很差,我知道肯定是我写的那些代码的问题,但是不知道怎么错了。。。求指点啊~!!!
[解决办法]
用debug调试一下,看看做除法的操作的时候错误在哪里。也许你是否参考一下做16位除法的时候需要注意什么。
[解决办法]
; 带注释的行是有修改的,修改的理由……自己看看吧datarea segment grade dw 88,75,95,63,98,78,87,73,90,60 rank dw 10 dup(?) view dw 10 dup(?)datarea endsprognam segment main proc far assume cs : prognam,ds :datareastart: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov di,10 mov bx,0loop1: mov ax,grade[bx] mov dx,0 mov cx,10 lea si,gradenext: cmp ax,[si] jg no_count add dx, 2 ;* inc dxno_count: add si,2 loop next mov rank[bx],dx add bx,2 mov si,dx mov view[si],ax dec di jne loop1 mov di,10 mov cx, 10 ;*+GO: mov si,11 sub si,di shl si, 1 ;*+ mov ax,view[si] mov bl,10 div bl mov dh,al push ax ;*+ add dh,30h mov dl,dh mov ah,02h int 21h pop ax ;*+ mov dh,ah add dh,30h mov dl,dh mov ah,02h int 21h mov dl, ' ' ;*+ int 21h ;*+ dec di loop GO ret main endpprognam ends end start