[英]C asm jmp going back to jmp after performing the jmp
我正在C
中的一些asm
代码中执行相对跳转。 我已经按照预期进行了跳转,但是在跳转发生并完成了代码运行之后,它又回到了右边。
#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,然后退出文件。
由于function
不执行ret
指令,因此其返回地址仍在堆栈上。 也就是说,当main
执行其 ret
,它使用的返回地址实际上是function
留下的地址,并返回x = 1;
线。
为了实现您的目标,执行跳转之前的function
必须调整堆栈指针,就好像从未调用过它一样。
就是说, 不要在家尝试这个 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.