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

lychina 2007-06-18 03:05:33
比如以下代码

.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

问题在注释中
...全文
529 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkbyest 2007-06-18
  • 打赏
  • 举报
回复
不是加了ret没有输出结果,而是不断循环输出,因为只有一个call,堆栈里的返回地址为mov dx,seg string 处的偏移值,所以每当遇到ret就pop该返回地址,相当于死循环。

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

至于标题的问题,那就是除了pop ip外,ret没有做别的操作。
zara 2007-06-18
  • 打赏
  • 举报
回复
ret 本身没有其它的行为了. 你的代码不能正常显示字符串吗? 应该可以的, 虽然程序在结构上有些不妥, .exit 语句应该是在 call print 和 main end 之间. print 子程还是需要 ret 指令的, 否则一般不能正常返回. 如果 proc 使用了 use 等修饰的话, 编译器可能会自动加上 ret 指令
lychina 2007-06-18
  • 打赏
  • 举报
回复
你可以加上ret后编译运行试试,没输出结果的
问这个问题时对子程序的编写还没仔细去看看,现在也知道正常的写法应该把.exit放在main过程里面
不过既然main中没有退出语句,应该是继续往下执行,那么似乎应该打印至少2次后退出的吧
为什么会一点输出结果都没有呢?

21,459

社区成员

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

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