gpt4 book ai didi

assembly - CALL 指令是否总是将 EIP 指向的地址压入堆栈?

转载 作者:行者123 更新时间:2023-12-04 17:17:19 25 4
gpt4 key购买 nike

在 x86 架构中的函数调用期间,是否存在返回地址未压入堆栈的情况?

最佳答案

CALL根据定义,将在跳转到目标地址之前将返回地址压入堆栈。那个返回地址是 EIP (或 RIP)+ sizeof(call instruction) (通常为 5 个字节。)

Volume 2 of the Intel® 64 and IA-32 Architectures Software Developer’s Manual声明 CALL :

Saves procedure linking information on the stack and branches to the called procedure specified using the target operand.



这包括:
  • 近呼 — “对当前代码段中的过程的调用”,其中 EIP 被压入堆栈。
  • 远程调用 — “调用位于与当前代码段不同的段中的过程”,其中 CS、EIP 被压入堆栈。

  • 不推送返回地址的替代方法是 JMP .

    我熟悉的每个 C 编译器都会使用 CALL 在 x86 上实现函数调用。指令,有一个异常(exception): tail call ,这可以通过 JMP 实现.这种情况尤其发生在一个函数返回另一个函数调用的结果时。例如。

    int bar(int a, int b);

    int foo(int a, int b)
    {
    if (a < b)
    return 0;

    return bar(a, b); // Will probably be: jmp bar
    }

    关于assembly - CALL 指令是否总是将 EIP 指向的地址压入堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685146/

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