鱼C论坛

 找回密码
 立即注册
查看: 1781|回复: 1

[技术交流] 有关ret指令有时不好用的问题

[复制链接]
发表于 2012-11-13 17:16:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
做实验10-3的时候发现ret没有跳到call指令的下一行,然后就试了试,弄清了ret的具体实现。

代码1:
定义栈段(省略)
code segment
start:mov ax,3
  mov bx,1
        。
        。
  call add_1
  
  mov ax,4c00h
  int 21h
  
  add_1:push ax
            add ax,bx
            ret
code ends

此时执行ret指令后跳转到mov bx,1(即第二句)

代码2:
定义栈段(省略)
code segment
start:mov ax,3
  mov bx,1
        。
        。
  call add_1
  
  mov ax,4c00h
  int 21h
  
  add_1:push ax
                 add ax,bx
          pop ax
          ret
code ends
只是在ret指令上一行加了pop ax
执行ret结果:跳到mov ax,4c00h.正常跳转

总结:为什么代码1没有正常跳转,原因是定义栈段的时候。使用ret相当于pop ip,这时候的ip有两种可能:
一种是ip指向定义的栈段,此时pop的ip是定义栈段里即时ip;
另一种是没定义栈段,或者定义了栈段但是栈的指针指向栈底(就是push与pop一样多的)
  这时候ret指令pop的ip则是由call时由系统自动分配的ip。

由此我们可以利用定义的栈段来自己设定ret的位置,相当于jmp了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-8 13:00:32 | 显示全部楼层

回帖奖励 +1 鱼币

谢谢楼主分享,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 20:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表