我无法理解.quad
函数在汇编中的工作原理。
从我在线阅读的内容来看,它为当前部分的每个表达式生成一个64位二进制补码值。我理解两个补码是什么,以及该部分引用.quad
被调用的行的事实。
通常在汇编中调用.quad
的地点和时间?
另外,为什么要使用.quad
生成任何内容?
答案 0 :(得分:9)
.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
)。
通常在汇编中调用.quad的地点和时间?
嗯..它的汇编程序指令,在编译期间使用,它只会生成机器代码。它不能被称为#34;。您可以调用/执行由它定义的机器代码,但这是非常罕见的使用模式,通过以数字方式将它们定义为操作码来生成指令,如果您有可以从助记符生成它的手头汇编程序。
另外,为什么要使用.quad生成任何内容?
如果要在数据段中设置64b数字1000000000000(1e12),将其定义为.quad 1000000000000
比计算单独的字节值并将其定义为.byte 0, 16, 165, 212, 232, 0, 0, 0
更方便。 .quad
情况下汇编程序将为您解析并拆分为字节。
.quad .L3
(来自评论)
.L3
是代码中某处的标签,因此它是一些内存地址,因此它是一些64位数(对于具有平面内存映射的x86 64b目标平台)。如果你想在内存中的某个地方拥有该值,那么使用.quad .L3
是如何使用该值生成8个字节的简单方法(地址为.L3
标签)。
switch
代码用于间接跳转,选择由开关值索引的内存中的特定值,然后跳转到存储在表中的内存中的地址。类似jmp [table + index*8]
的内容,当table+index*8
指向.L3
值时,jmp
会跳转到.L3
地址。