.quad 指令在汇编中如何工作?

How does the .quad directive work in assembly?

我无法理解 .quad 函数在汇编中的工作原理。

根据我在线阅读的内容,它为当前部分中的每个表达式生成一个 64 位二进制补码值。我了解二进制补码是什么以及该部分引用 .quad 被调用的行的事实。

.quad 通常在什么地方和什么时候在汇编中被调用?
另外,为什么要使用 .quad 来生成任何东西?

.quad 指令用于定义 64 位数值。以类似的方式 .byte 指令如何工作。

.quad 0x123456789ABCDEF0, 2, 3

将编译为 24 字节:

F0 DE BC 9A 78 56 34 12 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00

(为了比较,.byte 0x12, 2, 3 将编译为三个字节 12 02 03)。

Where and when is .quad usually called in assembly?

嗯..这是汇编程序指令,在编译期间使用,它只会产生机器代码。不可能是"called"。您可以 call/execute 它定义的机器代码,但这是非常罕见的使用模式,通过以数字方式将它们定义为操作码来生成指令,如果您手边有可以从助记符生成它的汇编程序。

Also, why use .quad to generate anything?

如果要在数据段中设置64b数1000000000000(1e12),定义为.quad 1000000000000比计算单独的字节值定义为.byte 0, 16, 165, 212, 232, 0, 0, 0方便多了,在 .quad 的情况下,汇编程序将为您进行解析和拆分为字节。

.quad .L3 (from comment)

.L3 是代码中某处的标签,所以它是一些内存地址,所以它是一些 64 位数字(对于具有平面内存映射的 x86 64b 目标平台)。如果你想在内存中的某个地方拥有该值,那么使用 .quad .L3 是如何使用该值生成 8 个字节的简单方法(.L3 标签的地址)。

switch代码用于间接跳转,选择内存中由开关值索引的特定值,然后跳转到table中存储在内存中的地址。类似于 jmp [table + index*8],当 table+index*8 指向 .L3 值时,jmp 将跳转到 .L3 地址。