英特尔和AT&T语法中内存寻址的一般形式如下:
[base + index*scale + disp]
disp(base, index, scale)
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
base和index任意注册?scale采用什么值,是1,2,4和8(默认值为1)?index和disp可互换的(唯一的区别index是寄存器disp是一个常数)?我在指向一个地址时遇到了麻烦,并在我的情况下写了一个大小为byte的变量.这给了我错误"错误:无效的有效地址":
mov byte[AX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
经过一些跟踪和错误后,我测试了相同但使用EAX.编译得很好:
mov byte[EAX], byte 0x0
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
考虑一个简单的指令,例如
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
我对x86-64二进制编码很新.我正在尝试修复一些旧的"汇编程序"代码.
无论如何,我正在尝试做这样的事情(英特尔语法):
mov [rbp+rcx], al
Run Code Online (Sandbox Code Playgroud)
汇编程序目前正在生成:
88 04 0D
Run Code Online (Sandbox Code Playgroud)
但这似乎不是一个有效的指示.如果我将SIB字节中的基数更改rbp为其他寄存器,则可以正常工作.另一种使其工作的方法是添加一个零字节的位移(88 44 0D 00).这似乎与其他类似的操作码一起发生.
为什么我不能rbp在那里使用mod=00?
assembly ×4
x86 ×3
x86-64 ×2
att ×1
intel-syntax ×1
machine-code ×1
nasm ×1
performance ×1
x86-16 ×1