所以我在一段时间后自学了x86程序集,只是在C ++中使用内联汇编。
所以我想做的是在函数参数,传入数组,索引(unsigned int)和数字。使用程序集,它会将数组的内存位置中的值更改为传入的值。所以代码看起来像这样。
inline void Set( int pArray[], unsigned int pIndex, int pNum ) {
__asm {
mov ebx, pIndex
mov eax, 4
mul ebx
mov ebx, pNum
lea edi, pArray
mov [ edi + eax ], ebx
}
}
int main() {
int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
Set( myArray, 2, 7 );
std::cout << myArray[ 2 ] << std::endl;
}
因此代码应加载数组地址的开头,获取索引并将其乘以4,以便将内存位置移动那么多字节,并将其更改为传入的值。但是,当我这样做时,价值保持不变。这是为什么?出了什么问题?
答案 0 :(得分:1)
lea edi, [pArray]
代表&#34;加载有效地址&#34;,你的lea放置参数的地址。你的意思是lea edi, [pArray + 4*ebx]
然而,还有两件事: 1)你不必乘以4。你可以做{{1}} 由于&#34;比例索引字节&#34;寻址模式允许您乘以4并添加一个立即地址。
2)你假设是32位。您在2015年中期使用的计算机仍然在32位模式下工作?
我在intel语法汇编上生锈了。我可以建议您学习汇编程序和C ++代码在GCC中的集成吗? https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html