我对汇编有一个非常简短的了解,并对这段代码的作用感到困惑?
movl (%eax, %edx, 4), %ecx
我的理解是%edx
乘以4,然后加上%eax
的值,然后存储在%ecx
这是表格中给出的值< / p>
给出的答案是0x11但是我没有得到答案。
答案 0 :(得分:3)
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
。
当CPU执行地址数学运算时,这个地址算术可以通过lea
指令使用,但不是从内存加载值,而是只存储计算出的地址,所以:
leal (%eax, %edx, 4), %ecx
将使用值ecx
加载0x10C
(无需访问内存)。这有时被欺骗了#34;用于进行简单算术,例如eax = 5*eax
:lea (eax,eax,4),eax
(可能比imul
快,并且不会更改标志寄存器,有时也很方便)。