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

时间:2017-03-24 17:12:39

标签: assembly

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

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

通常在汇编中调用.quad的地点和时间? 另外,为什么要使用.quad生成任何内容?

1 个答案:

答案 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地址。