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