为什么装配中会出现"Access violation reading location"错误?

Why does "Access violation reading location" error occur in assembly?

本文关键字:violation Access reading location 错误 为什么      更新时间:2023-10-16

这是我在数组中查找最大元素的C++代码:

#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int Max(int *i, int count);
    int main() {
        int i[10] = {1, 6, 7, 4, 8, 9, 6, 5 ,8 , 4};
        cout<< "Max " << Max(i ,10) << endl;
        _getch();
        return 0;
    }

未完成,但我在mov eax, [esi]行上得到访问违规读取位置错误。

我的ASM代码:

.code
Max proc
    mov esi,ecx
    mov ecx,edx
    mov eax, [esi]
    ret
Max endp
end

我该如何解决这个问题?

编辑:知道如何获取数组的第一个元素就足够了。

我看到的主要问题是您的代码更改了esi,并且没有将更改恢复到esi,这很危险。您应该在函数的开头放一个"push-esi",并在末尾添加一个"pop-esi"。

当我在调试模式下检查寄存器的值时,esi不在那里。有rsi寄存器代替它。然后我像这样重写代码;

mov rax,[rcx]

我删除了其他几行。现在,这就像一种魅力。我可以得到数组的第一个元素。

感谢@JSF。