当前位置: 代码迷 >> 汇编语言 >> 汇编子程序ret不到正确的地址解决方法
  详细解决方案

汇编子程序ret不到正确的地址解决方法

热度:156   发布时间:2016-05-02 04:27:34.0
汇编子程序ret不到正确的地址
assume cs:code,ds:data,ss:stack

data segment
x dw 1234
y dw 100 dup(?)  ;存放数字的ASCII码
data ends

stack segment
dw 16 dup(?)
stack ends

code segment
start: 
 mov ax,stack
 mov ss,ax
 mov ax,data
 mov ds,ax

mov dx,0 
 mov ax,x 
 mov si,0
 call s

mov ax,4c00h
 int 21h

s proc near
res:mov cx,10
 
 push ax
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
 
 push dx
 add cl,30h
 mov ds:[si+4],cl 
 pop dx
 push ax
 push dx
 add ax,dx
 jz goOut
 pop dx
 pop ax
 inc si
 jmp res
 
 goOut: 
 pop dx
 pop ax
 mov dl,ds:[si+4]
 mov ah,2
 int 21h
 cmp si,0
 jz ok
 dec si
 jmp goOut 
 
 ok:
 ret    //这个地方使用ret回不到原来的地方,因为程序并未返回dos
 ;mov ax,4c00h   //把ret直接改成返回dos就可以正常运行,请问是怎么一回事
 ;int 21h

 s endp

code ends
end start
------解决思路----------------------
http://tieba.baidu.com/p/3707242811
------解决思路----------------------
本帖最后由 mydo 于 2015-04-18 08:03:45 编辑
尝试把堆栈空间加大,比如:

stack segment
dw 128 dup(?)
stack ends

------解决思路----------------------
goOut: 
 pop dx
 pop ax
 mov dl,ds:[si+4]
 mov ah,2
 int 21h
 cmp si,0
 jz ok
 dec si
 jmp goOut 
这一部分jmp的时候一直在pop却没有push,然后jz到ret的时候堆栈会不平衡吧。
  相关解决方案