比如以下代码
.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没有做别的操作。