汇编语言程序中的访问冲突错误

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?