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

Jac*_*est 3 assembly

我无法理解该.quad功能在装配中的工作原理.

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

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

Ped*_*d7g 9

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

.quad 0x123456789ABCDEF0, 2, 3
Run Code Online (Sandbox Code Playgroud)

将编译为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
Run Code Online (Sandbox Code Playgroud)

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

通常在汇编中调用.quad的地点和时间?

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

另外,为什么要使用.quad生成任何东西?

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

.quad .L3 (来自评论)

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

switch代码用于间接跳转,选择由开关值索引的内存中的特定值,然后跳转到存储在表中的内存中的地址.有点像jmp [table + index*8],当table+index*8.L3数值时,那么jmp会跳转到.L3地址.