为什么程序集中出现“访问冲突读取位置”错误?

问题描述 投票:2回答:2

这是我在数组中查找max元素的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]线上收到了Access违规读取位置错误。

我的ASM代码:

.code
Max proc

    mov esi,ecx
    mov ecx,edx
    mov eax, [esi]

    ret
Max endp
end

我怎么解决这个问题?

编辑:这足以让我知道如何获得数组的第一个元素。

c++ assembly x86 x86-64
2个回答
0
投票

我看到的主要问题是你的代码改变了esi并且没有将更改恢复到它,这很危险。你应该在你的功能开始时放一个“推esi”,并在结尾添加一个“pop esi”。


-1
投票

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

mov rax,[rcx]

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

感谢@JSF。

© www.soinside.com 2019 - 2024. All rights reserved.