Assembly 汇编指令中有一个计算,它是如何工作的? 这可能是一个NoOB问题,因为我刚刚开始跳入C++代码的拆卸,以检查编译器最终为我做了什么。基本上我有一些C++代码(这是一个玩具例子):

Assembly 汇编指令中有一个计算,它是如何工作的? 这可能是一个NoOB问题,因为我刚刚开始跳入C++代码的拆卸,以检查编译器最终为我做了什么。基本上我有一些C++代码(这是一个玩具例子):,assembly,x86,Assembly,X86,我在这里的评论只是我对事情的理解,我正在逐步了解这些,以便更好地处理事情 我的问题是。。000210CA上的指令是如何工作的?esi+eax*4本身不是一种计算吗?为什么该指令本身不需要其他指令来计算?或者这就是真正发生的事情?在我看来,地址空间中的指令似乎是顺序的 如果有帮助,则由Visual Studio 2015编译,并从反汇编调试窗口提取此代码 英特尔x86体系结构允许采用[scale*index+base]格式的地址,其中scale是1、2、4或8,而index和base是寄存器(ea

我在这里的评论只是我对事情的理解,我正在逐步了解这些,以便更好地处理事情

我的问题是。。
000210CA
上的指令是如何工作的?
esi+eax*4
本身不是一种计算吗?为什么该指令本身不需要其他指令来计算?或者这就是真正发生的事情?在我看来,地址空间中的指令似乎是顺序的


如果有帮助,则由Visual Studio 2015编译,并从反汇编调试窗口提取此代码

英特尔x86体系结构允许采用
[scale*index+base]
格式的地址,其中
scale
是1、2、4或8,而
index
base
是寄存器(eax/ebx/ecx/edx/esp/ebp/esi/edi)。这些地址用一个称为SIB字节的机器指令字节表示。当然,您不能在单个汇编指令中嵌入任意计算。

请参见解释x86寻址模式的部分。是的,
[base+index*scale]
是一种有效的寻址模式,可以在任何允许有效地址作为其操作数之一的指令中使用。另请参见中的链接。还请注意,
movesi,dword ptr[giantVector]
是一个负载
std::vector
存储指向动态分配内存的指针。您将有更容易的时间理解C或C类C++的ASM输出,避免了STL和只使用数组。通常STL文件编译成零,就像这里一样,但它可能会导致大量asm。@aqez这是关于您在删除的答案中的问题:LEA指令(加载有效地址)通常用于使用x86寻址执行一般整数数学。举个简单的例子,
eax*=5
可以通过
leaeax、[eax+eax*2]
来完成。LEA允许您在不实际访问内存的情况下计算“地址”。
const int SIZE = 10000000;
for(auto i = 0; i < SIZE; i++)
{
  giantVector[i] = giantVector[i] * giantVector[i];
}
00021088  mov         esi,dword ptr [giantVector] //move a pointer to giantVector into esi
0002108B  xor         eax,eax                     //clear out eax
000210C4  mov         ecx,dword ptr [esi+eax*4]   //move int from vector into ecx
000210C7  imul        ecx,ecx                     //multiply ecx by itself
/* Move the result back into vector. This instruction uses esi as the base pointer
   to the first element in the vector then adds eax(loop counter) * 4(sizeof(int))
   to determine where to stick it. */
000210CA  mov         dword ptr [esi+eax*4],ecx   //move result back into vector
000210CD  inc         eax                         //increment the loop counter in eax
000210CE  cmp         eax,989680h                 //compare with SIZE constant
000210D3  jl          main+0C4h (0210C4h)         //If less, jump back into loop, otherwise fall through