gpt4 book ai didi

assembly - 什么是 callq 指令?

转载 作者:行者123 更新时间:2023-12-03 10:01:42 27 4
gpt4 key购买 nike

我有一些由工具生成的 x86_64 架构的 gnu 汇编代码,有以下说明:

movq %rsp, %rbp  
leaq str(%rip), %rdi
callq puts
movl $0, %eax

我找不到有关“callq”指令的实际文档。

我看过 http://support.amd.com/TechDocs/24594.pdf这是“AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions”但他们只描述了CALL Near和Far指令。

我查看了 gnu 汇编器的文档 https://sourceware.org/binutils/docs/as/index.html但找不到详细说明它支持的说明的部分。

我知道这是对函数的调用,但我想知道细节。我在哪里可以找到它们?

最佳答案

只是 call .如果您希望能够在 Intel/AMD 手册中查找说明,请使用 Intel 语法反汇编。
q操作数大小后缀在技术上确实适用(它推送 64 位返回地址并将 RIP 视为 64 位寄存器),但无法使用指令前缀覆盖它。即 calllcallw不能在 64 位模式下编码,所以有些 AT&T 语法工具将其显示为 callq 令人讨厌。而不是 call .这当然适用于 retq以及。

不同的工具在 32 位和 64 位模式下是不同的。 ( Godbolt )

  • gcc -S: 总是 call/ret .好的。
  • clang -S:callq/retqcalll/retl .至少它一直很烦人。
  • objdump -d: callq/retq (显式 64 位)和 call/ret (隐式用于 32 位)。不一致且有点愚蠢,因为 64 位无法选择操作数大小,但 32 位可以。 (虽然不是一个有用的选择:callw 将 EIP 截断为 16 位。)

    尽管另一方面,64 位模式下大多数指令的默认操作数大小(没有 REX.W 前缀)仍然是 32。但是 add $1, (%rdi)需要一个操作数大小的后缀;如果没有任何暗示,汇编器不会为您选择 32 位。奥托, push隐含地是 pushq ,即使 pushw $1pushq $1在 64 位模式下都是可编码的 ( and usable in practice )。


  • 从英特尔的指令集引用手册(上面链接):

    For a near call absolute, an absolute offset is specified indirectly in a general-purpose register or a memory location (r/m16, r/m32, or r/m64). The operand-size attribute determines the size of the target operand (16, 32 or 64 bits). When in 64-bit mode, the operand size for near call (and all near branches) is forced to 64-bits.

    for rel32 ... As with absolute offsets, the operand-size attribute determines the size of the target operand (16, 32, or 64 bits). In 64-bit mode the target operand will always be 64-bits because the operand size is forced to 64-bits for near branches.



    在 32 位模式下,您可以编码 16 位 call rel16将 EIP 截断为 16 位,或 call r/m16使用绝对 16 位地址。但正如手册所说,操作数大小在 64 位模式下是固定的。

    关于assembly - 什么是 callq 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752964/

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