movl (%eax, %edx, 4), %ecx 指令有什么作用?

What does movl (%eax, %edx, 4), %ecx instruction do?

我对汇编的了解非常简单,对下面这段代码的作用感到困惑?

movl (%eax, %edx, 4), %ecx

我的理解是%edx乘以4然后加上%eax的值然后存入%ecx这就是table 给出值

Register Values

给出的答案是 0x11 但是我没有得到那个答案。

EDX 乘以 4,加到 EAX,从该地址的内存中读取一个 4 字节的值,并放入 ECX。

MOV一般不进行运算,除非是地址计算。


在您的特定情况下:edx = 3eax = 0x100temporary_address_in_CPU_during_mov = eax + edx * 4 = 0x100 + 3*4 = 0x10C。地址 0x10C 处内存中的值为 0x11.

这个地址算法可以通过 lea 指令自己使用,当 CPU 将进行地址数学运算时,它不会从内存中加载值,而是只存储计算出的地址,因此:

leal (%eax, %edx, 4), %ecx

将用值 0x10C 加载 ecx(不访问内存)。有时 "tricked" 用于进行简单的算术运算,例如 eax = 5*eax : lea (eax,eax,4),eax (可能比 imul 更快并且不更改标志寄存器,有时很方便)。