汇编语言程序中的访问冲突错误
Access violation error in Assembly Language program
我用汇编语言编写了一个程序来执行一些算术运算。
我收到以下错误,我的 cmd 因一些大内存转储而崩溃。错误是:
First-chance exception at 0x004011c6 in Prog.exe: 0xC0000005: Access violation reading location 0x00406000. Unhandled exception at 0x004011c6 in Prog.exe: 0xC0000005: Access violation reading location 0x00406000.
是什么导致了这个错误,我该如何解决?
include Irvine32.inc
.data
A SDWORD ?
B SDWORD 10
C SDWORD 20
D SDWORD 30
.code
main PROC
MOV eax, B
SUB eax, C
ADD edx, D
ADD edx, 3
ADD edx, B
SUB edx, 10
SUB edx, D
SUB eax, edx
MOV A, eax
CALL DumpRegs
CALL DumpMem
exit
main ENDP
END main
内存转储:
您的算术不是导致崩溃的原因。在底部你调用 Irvine32 Library's DumpRegs feature that displays the registers at the top. That is fine, but what is crashing is the call to DumpMem。它正在崩溃,因为您没有正确地将参数初始化为 DumpMem。您需要设置起点、大小和要打印的值的数量。结果是它开始从意想不到的位置转储内存,直到它在您的程序无法访问的内存地址处失败。这导致了访问冲突。
要打印的有用内容可能是结果 A
以及它之后内存中的其他 3 个变量。根据 DumpMem 文档:
DumpMem PROC
Writes a range of memory to standard output in hexadecimal.
Call args: ESI = starting offset
ECX = number of units
EBX = bytes/unit (1,2,or 4)
Return arg: None
如果您想开始打印 32 位(4 字节)SDWORD,从 A
开始并包括其后的 3 个 SDWORD,您可以将代码修改为:
CALL DumpRegs
MOV ESI, OFFSET A ; Address A is start of memory to print
MOV EBX, SIZEOF A ; Same as MOV EBX, 4
MOV ECX, 4 ; Number of 32-bit SDWORDs to print
CALL DumpMem
代码观察
与访问冲突无关的是您在开头有此代码:
MOV eax, B
SUB eax, C
ADD edx, D
当您的程序启动时 运行 无法保证寄存器为零。在此代码中,您将 D
添加到 EDX 并将结果存储在 EDX 中。您可能打算简单地 MOV EDX, D
而不是使用 ADD?
我用汇编语言编写了一个程序来执行一些算术运算。 我收到以下错误,我的 cmd 因一些大内存转储而崩溃。错误是:
First-chance exception at 0x004011c6 in Prog.exe: 0xC0000005: Access violation reading location 0x00406000. Unhandled exception at 0x004011c6 in Prog.exe: 0xC0000005: Access violation reading location 0x00406000.
是什么导致了这个错误,我该如何解决?
include Irvine32.inc
.data
A SDWORD ?
B SDWORD 10
C SDWORD 20
D SDWORD 30
.code
main PROC
MOV eax, B
SUB eax, C
ADD edx, D
ADD edx, 3
ADD edx, B
SUB edx, 10
SUB edx, D
SUB eax, edx
MOV A, eax
CALL DumpRegs
CALL DumpMem
exit
main ENDP
END main
内存转储:
您的算术不是导致崩溃的原因。在底部你调用 Irvine32 Library's DumpRegs feature that displays the registers at the top. That is fine, but what is crashing is the call to DumpMem。它正在崩溃,因为您没有正确地将参数初始化为 DumpMem。您需要设置起点、大小和要打印的值的数量。结果是它开始从意想不到的位置转储内存,直到它在您的程序无法访问的内存地址处失败。这导致了访问冲突。
要打印的有用内容可能是结果 A
以及它之后内存中的其他 3 个变量。根据 DumpMem 文档:
DumpMem PROC
Writes a range of memory to standard output in hexadecimal. Call args: ESI = starting offset ECX = number of units EBX = bytes/unit (1,2,or 4) Return arg: None
如果您想开始打印 32 位(4 字节)SDWORD,从 A
开始并包括其后的 3 个 SDWORD,您可以将代码修改为:
CALL DumpRegs
MOV ESI, OFFSET A ; Address A is start of memory to print
MOV EBX, SIZEOF A ; Same as MOV EBX, 4
MOV ECX, 4 ; Number of 32-bit SDWORDs to print
CALL DumpMem
代码观察
与访问冲突无关的是您在开头有此代码:
MOV eax, B
SUB eax, C
ADD edx, D
当您的程序启动时 运行 无法保证寄存器为零。在此代码中,您将 D
添加到 EDX 并将结果存储在 EDX 中。您可能打算简单地 MOV EDX, D
而不是使用 ADD?