在函数中更改数组值 - 内联汇编

时间:2015-06-16 15:57:25

标签: c++ arrays assembly x86 inline-assembly

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

1 个答案:

答案 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