使用JMP而不是CALLS

时间:2014-03-15 09:48:32

标签: assembly keil

是否可以使用JMP指令跳转到函数的起始地址,为什么会这样做呢?

2 个答案:

答案 0 :(得分:2)

在Prinziple中,只要遵守规则,您就可以混合使用jmp和通话。 call自动在堆栈上推送返回地址。

 call x
 mov eax, 0   <-  returns here

x:
  do something
  ret

这也可以通过fowlloing代码完成:

 jmp x
 :retAdr
 mov eax, 0   <-  returns here

x:
   do something
    push retAdr    <- Basically it would be similar to a jmp, but of course the target can be calculated as well.
   ret

当然,你也可以反过来做。

call x
mov eax, 0

x:
   pop eax  <- ret adress
   do something
   jmp eax

虽然这些伪代码样本可能看起来不太有用,但在特殊情况下以这种方式使用它们可能是有用的。 jmp的目标可以是任何地址,因此它也可以是函数或过程。这里没有区别。

我已经看到在蚂蚁调试技术中使用它来模糊返回路径并使反转变得更难。它也可以用于jmp表或其他东西。我在一个函数中使用了jmp,当我在其他地方重新编写现有函数时,然后将代码转发到originall函数(注入代码)。

答案 1 :(得分:1)

最常见的例子是Jester提到的尾调用优化,通常是当中间函数没有返回值或者初始调用者忽略返回值时。编码示例:

        call    x
;       ...
x:
;       ...
        call    y
        ret

优化为:

        call    x
;       ...
x:
;       ...
        jmp     y