为什么装配中会出现"Access violation reading location"错误?
Why does "Access violation reading location" error occur in assembly?
这是我在数组中查找最大元素的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。
相关文章:
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 为什么调试器引发"read access violation. this was nullptr"异常?
- Simulink "Access Violation"写入 C++ lambda 函数捕获列表中的 PWork 变量
- Qt QXmlStreamReader Access Violation
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 例外:'Access violation reading location'
- 我在发布模式下运行时收到"Access violation reading location"错误 - C++
- 如何修复我的 c++ 毕达哥拉斯三重查找器中的'access violation reading location'错误?
- 矩阵 - "Access violation writing location 0x00900B0C" - C++ 中的错误
- 如何修复此代码中的'Access violation reading location'
- 过载时出错 << "Exception thrown: read access violation.m.matrix was 0xCDDDCDDE."
- c++:链表错误" Access violation reading location"
- Q维吉特"access violation"
- System.UStrClr Access Violation
- msftedit "Access violation reading location 0x00000008"错误.dll SetWindowSub类中的RichEdit控件
- CreateBuffer 抛出一个"Access violation reading location"
- glMapBufferRange Access Violation
- 指针已初始化,但我有错误"Access violation reading location 0xCCCCCCCC".为什么?
- VC++ vector::p ush_back "Access Violation" in DLL
- "Read Access Violation: This was nullptr" 以为我分配正确...?