gpt4 book ai didi

C asm jmp 在执行 jmp 之后返回到 jmp

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:49 24 4
gpt4 key购买 nike

我正在 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执行itsret时,它使用的返回地址实际上是function留下的地址,然后回到 x = 1; 行。

为了实现您的目标,函数在执行跳转之前必须调整堆栈指针,就好像它从未被调用过一样。

也就是说,不要在家里尝试这个

关于C asm jmp 在执行 jmp 之后返回到 jmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com