x86 上有偏移写回吗?

Dan*_*cco 2 x86 assembly arm addressing-mode

使用 ARM,我可以访问这样的内存位置:

LDR r0, [r1, #4]!
Run Code Online (Sandbox Code Playgroud)

意思是我想加载 r1 指向的值,偏移量为 4 个字节,并且 ! 意味着我希望在这条指令之后用新值(即+4)更新r1 的值。

x86 上是否有等效的语法(如果可能的话,AT&T 语法)?例如:

movl 4(%ebx), %eax
Run Code Online (Sandbox Code Playgroud)

这会将 %ebx 所指向的值(偏移量为 4 个字节)加载到 %eax 中。加载后如何更新 %ebx 的值?

谢谢。

Jon*_*art 5

我认为您正在寻找的指令LODSD意味着“从字符串加载 DWORD”。不过,您无法选择寄存器:指针位于ESI,目标寄存器为EAX

将字节、字或双字从内存位置传输到 AL、AX 或 EAX 寄存器后,(E)SI 寄存器根据 EFLAGS 寄存器中 DF 标志的设置自动递增或递减。(如果 DF 标志为 0,则 (E)SI 寄存器递增;如果 DF 标志为 1,则 ESI 寄存器递减。)对于字节操作,(E)SI 寄存器递增或递减 1,通过2 用于字操作,或乘 4 用于双字操作。

抱歉,Intex 语法现在已经在我脑海中根深蒂固了。假设平面 32 位保护模式:

mov   esi, _source_data_       ; ESI points to source data
cld                            ; Clear the direction flag
                               ; (ESI will increment)
lodsd                          ; Essentially   mov eax, [ds:esi]
                               ;               add esi, 4
Run Code Online (Sandbox Code Playgroud)

  • 现在,当这条指令存在时...序列 `mov (%esi),%eax; lea 4(%esi),%esi` 可能会更快。所谓的_字符串指令_具有相当高的指令延迟,并且它们仅与使用寄存器“%edi”(用于存储)和“%esi”(用于加载)相关。不,这绝对不如 ARM 的通用后置/预置/递减寻址那么灵活。 (3认同)