当前位置: 代码迷 >> 汇编语言 >> ret指令除了出栈送ip(或eip)和cs还做了什么?解决方法
  详细解决方案

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

热度:8171   发布时间:2013-02-26 00:00:00.0
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没有做别的操作。
  相关解决方案