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 = 3
、eax = 0x100
、temporary_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
更快并且不更改标志寄存器,有时很方便)。
我对汇编的了解非常简单,对下面这段代码的作用感到困惑?
movl (%eax, %edx, 4), %ecx
我的理解是%edx
乘以4然后加上%eax
的值然后存入%ecx
这就是table 给出值
Register Values
给出的答案是 0x11 但是我没有得到那个答案。
EDX 乘以 4,加到 EAX,从该地址的内存中读取一个 4 字节的值,并放入 ECX。
MOV一般不进行运算,除非是地址计算。
在您的特定情况下:edx = 3
、eax = 0x100
、temporary_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
更快并且不更改标志寄存器,有时很方便)。