我无法理解 .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 )。



嗯..它是汇编指令,在编译过程中使用,它只会产生机器码。它不能被“称为”。您可以调用/执行由它定义的机器代码,但这是非常罕见的使用模式,通过以数字方式将它们定义为操作码来生成指令,如果您手头有可以从助记符生成它的汇编程序。



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


.L3 是代码中某处的标签,所以它是一些内存地址,所以它是一些 64 位数字(对于具有平面内存映射的 x86 64b 目标平台)。如果您想在内存中的某个地方使用该值,那么使用 .quad .L3 是一种简单的方法,即如何使用该值(.L3 标签的地址)生成 8 个字节。
switch 代码用于间接跳转,在由开关值索引的内存中选择特定值,然后跳转到表中存储在内存中的地址。类似于 jmp [table + index*8] ,当 table+index*8 指向 .L3 值时,那么 jmp 会跳转到 .L3 地址。

关于assembly - .quad 指令如何在汇编中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43005411/

10-12 00:33