我想知道我是否正确得到了这个:
据我所知,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]
乘法会发生什么?
答案 0 :(得分:2)
按照你的代码,它总是更容易分解:
esi
是指向arr
ecx
是i
sizeof(int)
= 40 所以现在我们把它放在一起:
mov eax, dword ptr[esi + ecx* 4 + 40]
因此你的陈述是正确的。你的汇编程序应该将第二个乘法折叠到一个常数40,如果没有,那么你需要手动计算它,但你需要在汇编程序(或编译器,如果这是内联函数)上测试它组件)。
<强>更新强>
您需要将常量调整为新元素大小,但不需要更改寄存器:
mov eax, dword ptr[esi + ecx * 2 + 20]
如果这是作为内联汇编程序完成的,那么你可以使用sizeof
运算符,使生活更简单,并将它折叠起来,某些汇编程序也可以允许SIZEOF宏。