执行jmp后,C asm jmp返回jmp

时间:2016-12-01 17:15:48

标签: c assembly

我在asm中的某些C代码中执行相对跳转。我已经按预期跳转了,但是在跳转发生并完成代码运行后它会回到正确的位置。

#include <stdio.h>

void function() {
    asm("jmp .+0x31"); //this happens to be where I want to jump to from the function call
}

void main(int argc, char* argv[]) {
    int x;
    x = 0;
    function();
    x = 1;
    x = x + 1;
    printf("%d\n", x);
}

0x000000000040053f <+0>:     push   %rbp
0x0000000000400540 <+1>:     mov    %rsp,%rbp
0x0000000000400543 <+4>:     sub    $0x20,%rsp
0x0000000000400547 <+8>:     mov    %edi,-0x14(%rbp)
0x000000000040054a <+11>:    mov    %rsi,-0x20(%rbp)
0x000000000040054e <+15>:    movl   $0x0,-0x4(%rbp)
0x0000000000400555 <+22>:    mov    $0x0,%eax
0x000000000040055a <+27>:    callq  0x400536 <function>
0x000000000040055f <+32>:    movl   $0x1,-0x4(%rbp)
0x0000000000400566 <+39>:    addl   $0x1,-0x4(%rbp)
0x000000000040056a <+43>:    mov    -0x4(%rbp),%eax
0x000000000040056d <+46>:    mov    %eax,%esi
0x000000000040056f <+48>:    mov    $0x400620,%edi
0x0000000000400574 <+53>:    mov    $0x0,%eax
0x0000000000400579 <+58>:    callq  0x400410 <printf@plt>
0x000000000040057e <+63>:    nop
0x000000000040057f <+64>:    leaveq
0x0000000000400580 <+65>:    retq

function()的调用之后,它按预期打印0,但是在调用function()之后它会返回代码并打印2。我错过了jmp的工作原理吗?有没有办法通过asm代码退出?

这样做的目的是跳过

x = 1;
x = x + 1;

然后打印0,然后退出文件。

1 个答案:

答案 0 :(得分:2)

由于function没有执行ret指令,因此其返回地址仍在堆栈中。也就是说,当main执行 ret时,它使用的返回地址实际上是function留下的地址,并返回x = 1;行。

为了实现目标,在进行跳转之前function必须调整堆栈指针,就像从未调用过一样。

那就是说,不要在家里试试