2

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

LDR r0, [r1, #4]!

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

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

movl 4(%ebx), %eax

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

谢谢。

4

1 回答 1

4

我认为您正在寻找的指令是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
于 2013-07-02T23:34:54.257 回答