|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
该问题是实验10第3问显示数值的问题
这里有两个差不多一样的代码,就是子程序dtoc进栈和处栈顺序不一样的问题,如下:
(1)
- assume cs: code
- data segment
- db 10 dup (0)
-
- data ends
- code segment
- start : mov ax, 12666
- mov bx, data
- mov ds, bx
- mov si, 0
- call dtoc
-
- mov dh, 8
- mov dl, 3
- mov cl, 2
- call show_str
-
- mov ax, 4c00H
- int 21H
-
- dtoc : push ax
- push bx
- push cx
- push dx
- push si
- push di
-
- mov di, 0
- d10 : mov dx, 0
- mov bx, 10
- div bx
-
- add dx, 30H
- push dx
- inc di
- mov cx, ax
- jcxz d11
-
- jmp d10
-
- d11: mov cx, di
- d12: pop dx
- mov [si], dl
- inc si
-
- loop d12
-
- mov dl, 0
- mov [si], dl
-
-
-
-
- okay: pop si
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
-
- ret
-
- show_str:mov bx, 0
- mov ax, 0b800H
- mov es, ax
- dec dh
- mov al, dh
- mov dh, 160
- mul dh
- mov bx, ax
- mov al, dl
- mov dl, 2
- mul dl
- add bx, ax
- mov ah, cl
- mov cl, 0
- show : mov al, [si]
- mov es:[bx], ax
- mov ch, [si]
- inc si
- add bx, 2
-
- jcxz ok
-
- jmp show
- ok : ret
- code ends
- end start
复制代码
(2)
- assume cs: code
- data segment
- db 10 dup (0)
-
- data ends
- code segment
- start : mov ax, 12666
- mov bx, data
- mov ds, bx
- mov si, 0
- call dtoc
-
- mov dh, 8
- mov dl, 3
- mov cl, 2
- call show_str
-
- mov ax, 4c00H
- int 21H
-
- dtoc : push ax
- push bx
- push cx
- push dx
- push si
- push di
-
- mov di, 0
- d10 : mov dx, 0
- mov bx, 10
- div bx
-
- add dx, 30H
- push dx
- inc di
- mov cx, ax
- jcxz d11
-
- jmp d10
-
- d11: mov cx, di
- d12: pop dx
- mov [si], dl
- inc si
-
- loop d12
-
- mov dl, 0
- mov [si], dl
-
-
-
-
- okay: pop ax
- pop bx
- pop cx
- pop dx
- pop si
- pop di
-
- ret
-
- show_str:mov bx, 0
- mov ax, 0b800H
- mov es, ax
- dec dh
- mov al, dh
- mov dh, 160
- mul dh
- mov bx, ax
- mov al, dl
- mov dl, 2
- mul dl
- add bx, ax
- mov ah, cl
- mov cl, 0
- show : mov al, [si]
- mov es:[bx], ax
- mov ch, [si]
- inc si
- add bx, 2
-
- jcxz ok
-
- jmp show
- ok : ret
- code ends
- end start
复制代码
这两个代码就是因为进入栈的顺序不一样就能导致得到不同的结果,前者能够显示想要的结果,而后者却是乱码,这是为什么呢?(用的masm5.0编译)
假设ax,bx,cx,dx,si,di分别是1,2,3,4,5,6,按照你第二个顺序取出来ax,bx,cx,dx,si,di的值就变成了6,5,4,3,2,1
从栈顶一个一个存放进去,然后从存放的最后一个数的地址反向取出。虽然你没直接mov si, bx,但是你pop si的值就是push bx进去的值。
|
|