使用 ARM,我可以访问这样的内存位置:
LDR r0, [r1, #4]!
这意味着我想加载 r1 指向的值,偏移量为 4 个字节,并且!表示我希望在这条指令之后用新值(即 +4)更新 r1 的值。
x86 上是否有等价物(如果可能,AT&T 语法)?例如:
movl 4(%ebx), %eax
这会将 %ebx 指向的值以 4 个字节的偏移量加载到 %eax 中。加载后如何更新 %ebx 的值?
谢谢。
使用 ARM,我可以访问这样的内存位置:
LDR r0, [r1, #4]!
这意味着我想加载 r1 指向的值,偏移量为 4 个字节,并且!表示我希望在这条指令之后用新值(即 +4)更新 r1 的值。
x86 上是否有等价物(如果可能,AT&T 语法)?例如:
movl 4(%ebx), %eax
这会将 %ebx 指向的值以 4 个字节的偏移量加载到 %eax 中。加载后如何更新 %ebx 的值?
谢谢。
我认为您正在寻找的指令是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