我想使用 AT&T 风格的汇编将内存中某个地址的值复制到寄存器。我知道这应该不难,我认为在英特尔风格中它是这样的:
mov rdi, [0xdeadbeef]
Run Code Online (Sandbox Code Playgroud)
但我对 AT&T 风格(或一般的组装)了解不多。我搜索了它,但我得到的所有例子mov都不包括这个。
那么谁能告诉我该指令是什么样的?
另外,在哪里可以找到 AT&T 风格的 x86_64 汇编指令的完整列表?
考虑一个简单的指令,例如
mov RCX, RDI # 48 89 f9
Run Code Online (Sandbox Code Playgroud)
48 是 x86_64 的 REX 前缀。它不是LCP。但请考虑添加 LCP(用于对齐目的):
.byte 0x67
mov RCX, RDI # 67 48 89 f9
Run Code Online (Sandbox Code Playgroud)
67 是地址大小前缀,在本例中用于没有地址的指令。该指令也没有立即数,并且不使用 F7 操作码(假 LCP 停止;F7 将是 TEST、NOT、NEG、MUL、IMUL、DIV + IDIV)。假设它也不跨越 16 字节边界。这些是 Intel优化参考手册中提到的 LCP 停顿情况。
该指令是否会导致 LCP 停顿(在 Skylake、Haswell 等上)?两个 LCP 怎么样?
我日常驾驶的是 MacBook。所以我无法访问 VTune,也无法查看 ILD_STALL 事件。还有其他方法可以知道吗?
performance assembly x86-64 cpu-architecture micro-optimization
我正在编写自己的汇编程序并尝试对 ADC 指令进行编码,我对立即值有疑问,尤其是在将 8 位值添加到 AX 寄存器时。
添加 16 位值时:adc ax, 0xff33被编码为15 33 ff正确的。但是如果adc ax, 0x33被编码为会重要15 33 00吗?
Nasm 将83 d0 33其编码为显然是正确的,但我的方法也正确吗?