装配中的相对寻址

时间:2012-02-20 11:19:55

标签: assembly intel

我想知道我是否正确得到了这个:

据我所知,x86中相对寻址的语法是这样的:

base + index * scale + displacement

现在Igiven这些假设:

int i //valuee in ecx 
int arr[256] //adress in esi

我想将以下内容加载到eax中:

arr [i + 10]

我的第一个猜测是:

mov eax, dword ptr[esi + ecx*4 + 10*4]

但我不确定第二次乘法,因为它不符合上面提到的语法。

另外:如果索引和数组的数据类型不同,该怎么办? e.g:

short arr[i + 10]

乘法会发生什么?

1 个答案:

答案 0 :(得分:2)

按照你的代码,它总是更容易分解:

  • esi是指向arr
  • 的指针
  • ecxi
  • 10 * sizeof(int) = 40

所以现在我们把它放在一起:

mov eax, dword ptr[esi + ecx* 4 + 40]

因此你的陈述是正确的。你的汇编程序应该将第二个乘法折叠到一个常数40,如果没有,那么你需要手动计算它,但你需要在汇编程序(或编译器,如果这是内联函数)上测试它组件)。

<强>更新

您需要将常量调整为新元素大小,但不需要更改寄存器: mov eax, dword ptr[esi + ecx * 2 + 20]

如果这是作为内联汇编程序完成的,那么你可以使用sizeof运算符,使生活更简单,并将它折叠起来,某些汇编程序也可以允许SIZEOF宏。