汇编子程序ret不到正确的地址

会打代码的扫地王大爷 2015-04-17 10:41:53
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
...全文
211 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2015-04-20
  • 打赏
  • 举报
回复
楼上说得对,这个循环里,循环应该是在 mov dl, ds:[si+4] 处:
 goOut: 
pop dx
pop ax
goout2:
mov dl,ds:[si+4]
mov ah,2
int 21h
cmp si,0
jz ok
dec si
jmp goOut2
另外,你只设置了 ss 却没有设置 sp,堆栈空间上是错误的,虽然对你的代码没有不良影响。
  • 打赏
  • 举报
回复
那个就是我提的问题
大熊猫侯佩 2015-04-18
  • 打赏
  • 举报
回复
尝试把堆栈空间加大,比如:

stack segment
dw 128 dup(?)
stack ends
baidu_23107797 2015-04-18
  • 打赏
  • 举报
回复
http://tieba.baidu.com/p/3707242811
纵横车 2015-04-18
  • 打赏
  • 举报
回复
[code=ASM]goOut: pop dx pop ax mov dl,ds:[si+4] mov ah,2 int 21h cmp si,0 jz ok dec si jmp goOut [/code]这一部分jmp的时候一直在pop却没有push,然后jz到ret的时候堆栈会不平衡吧。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧