【发布时间】:2015-09-01 13:37:17
【问题描述】:
所以我不久前自学了 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,以便内存位置移动那么多字节,并将其更改为传入的值。但是,当我这样做时,值保持不变。这是为什么?出了什么问题?
【问题讨论】:
-
您可能需要
mov edi, pArray,否则您可能正在加载参数变量的地址,而不是它指向的位置。您可能也想使用调试器自学:) -
是的。这就是问题所在。我最初是从一个函数中写出来的,该数组可以在它的范围内访问,因此它可以工作,但是当封装在函数中时它停止工作,所以这很有意义,为什么我应该使用“mov”而不是“莉亚”。谢谢:-)
标签: c++ arrays assembly x86 inline-assembly