|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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进去的值。
|
|