首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

ret指令除了出栈送ip(或eip)和cs还做了什么?解决方法

2012-02-19 
ret指令除了出栈送ip(或eip)和cs还做了什么?比如以下代码.modelsmall.datastringdbTryagain,youhavenstarf

ret指令除了出栈送ip(或eip)和cs还做了什么?
比如以下代码

.model   small
.data
                string   db   'Try   again,you   have   n   starfighters   left. ',13,10, '$ '
.code
.startup
main   proc
call   print
main   endp
print   proc
                mov   dx,seg   string
                mov   ds,dx
                lea   dx,string
                mov   ah,9
                int   21h
                ;这里如果加上ret的话,就不会有打印结果,ret除了送出栈外是不是还做了其他什么工作?

print   endp
         
.exit
end

问题在注释中

[解决办法]
ret 本身没有其它的行为了. 你的代码不能正常显示字符串吗? 应该可以的, 虽然程序在结构上有些不妥, .exit 语句应该是在 call print 和 main end 之间. print 子程还是需要 ret 指令的, 否则一般不能正常返回. 如果 proc 使用了 use 等修饰的话, 编译器可能会自动加上 ret 指令
[解决办法]
不是加了ret没有输出结果,而是不断循环输出,因为只有一个call,堆栈里的返回地址为mov dx,seg string 处的偏移值,所以每当遇到ret就pop该返回地址,相当于死循环。

你遇到的问题可能跟你的编译器版本有关。
我用masm6.11。

至于标题的问题,那就是除了pop ip外,ret没有做别的操作。

热点排行