唐找北 发表于 2012-11-13 17:16:00

有关ret指令有时不好用的问题

做实验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了

hzx13888566458 发表于 2013-4-8 13:00:32

谢谢楼主分享,谢谢
页: [1]
查看完整版本: 有关ret指令有时不好用的问题