更改函数中的数组值 - 内联程序集

Changing Array Values In Function - Inline Assembly

本文关键字:程序集 数组 函数      更新时间:2023-10-16

所以我不久前自学了x86汇编,只是在C++中玩内联汇编。

所以我想做的是在函数参数中,传入一个数组、一个索引(无符号整数)和一个数字。使用程序集,它会将数组该内存位置中的值更改为传入的值。所以代码看起来像这样。

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,以便内存位置移动这么多字节,并将其更改为传入的值。但是,当我这样做时,值保持不变。为什么?出了什么问题?

lea代表"加载有效地址",您的lea放置参数的地址。 你的意思是lea edi, [pArray]

但是,还有两件事:1)你不必乘以四。 你可以做lea edi, [pArray + 4*ebx]由于"缩放索引字节"寻址模式允许您乘以 4 并添加一个即时地址。

2)你假设32位。 您使用的哪台计算机在2015年中期仍在32位模式下工作?

我对英特尔语法汇编生疏。 我可以推荐你学习GCC中汇编程序和C++代码的集成吗?https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html