| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4796 人关注过本帖
标题:汇编子程序ret不到正确的地址
只看楼主 加入收藏
wlmnzf
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-8-7
收藏
 问题点数:0 回复次数:7 
汇编子程序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
搜索更多相关主题的帖子: 子程序 
2015-04-17 22:46
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11771
专家分:43421
注 册:2006-5-13
收藏
得分:0 
中断的返回与程序的结束可不是一回事。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-04-18 07:21
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
你这个代码编译后属于系统可执行文件,系统加载该文件后会先进行自我现场保护,还会处理一些参数,因此除非你清楚系统做了哪些处理,否则贸然ret可能返回不到正确的位置。

能编个毛线衣吗?
2015-04-18 09:17
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11771
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用边小白在2015-4-19 07:52:13的发言:

还好,那些字母和数字我还认识,只是拼在一起不知道什么意思。

涉嫌灌水

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-04-19 08:09
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
楼主的程序问题出在下面这段代码:
goOut:
pop dx
pop ax
mov dl,ds:[si+4]
mov ah,2
int 21h
cmp si,0
jz ok
dec si
jmp goOut
当程序执行到这一段时,按顺序执行到"cmp si,0"如果si=0则跳到"ok"处执行,程序正常退出,但如果si<>0,则回到"goOut"段继续执行"pop dx""pop ax",但之前入栈的ax与dx已经在第一次执行这2条指令时被弹出了,所以此时弹出的应该是"返回地址",并且程序继续执行下去,如果si<>0,将又跳回"goOut"段执行,这样不断的出栈,而没有入栈操作,等到si=0跳到"ok"段执行时,出栈的已经不是正确的返回地址了,自然不能正确返回.我在汇编网里也回答过.希望能帮到你!
2015-04-28 10:10
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
goOut:
pop dx
pop ax
mov dl,ds:[si+4]
mov ah,2
int 21h
cmp si,0
jz ok
dec si
jmp goOut
解决办法:
goOut:
pop dx
pop ax
show:
mov dl,ds:[si+4]
mov ah,2
int 21h
cmp si,0
jz ok
dec si
jmp show
收到的鲜花
  • wmf20142015-04-30 06:32 送鲜花  50朵   附言:赞一个
2015-04-29 12:30
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 9楼 取名字
嗯,认真仔细到位!

能编个毛线衣吗?
2015-04-30 06:31
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
谢谢wmf2014版主!
2015-04-30 09:08
快速回复:汇编子程序ret不到正确的地址
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018260 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved