汇编语言项目调试出现0xC0000005访问违例错误求助
解决汇编代码中的访问违例错误及矩阵创建问题
核心问题分析
你遇到的0xC0000005访问违例错误,本质是代码中存在多处寄存器使用错误、输入逻辑错误、内存布局错误,导致程序尝试访问非法内存地址:
ReadInt 使用完全错误
Irvine32的ReadInt指令是将用户输入的整数存入EAX寄存器,而非通过EDX传递变量地址。原代码中试图用mov edx, OFFSET firstDimension后调用ReadInt,完全不符合该函数的调用规范,导致FirstDimension和SecondDimension始终是未初始化的垃圾值。MUL 指令误用
32位MUL指令的逻辑是:EAX作为被乘数,操作数作为乘数,结果存入EDX:EAX。原代码第47行执行mul FirstDimension时,EAX中是之前操作残留的无效值,乘法结果覆盖EDX:EAX后,后续逻辑完全混乱。矩阵存储定义错误
m1、m2、mp被定义为单个DWORD变量,但矩阵需要存储多个元素,单个变量无法承载,后续调用DumpMem时必然访问非法内存。DumpMem 参数未正确设置
Irvine32的DumpMem要求:EBX:内存块起始地址ECX:内存块中的元素总数(每个元素为DWORD)
原代码未设置这些参数就直接调用,导致程序读取未知内存区域。
修正后的完整代码
INCLUDE <C:\Irvine\Irvine32.inc> INCLUDELIB <C:\Irvine\Irvine32.lib> .stack 4096 ExitProcess PROTO, dwExitCode:DWORD .data FirstDimension dword ? SecondDimension dword ? prompt1 BYTE "Please enter first positive integer 1 - 9: ", 0 prompt2 BYTE "Please enter second positive integer 1 - 9: ", 0 ; 预留最大9*9=81个DWORD的空间作为矩阵存储 m1 DWORD 81 DUP(?) m2 DWORD 81 DUP(?) mp DWORD 81 DUP(?) .code main PROC ; 初始化随机数生成器,确保每次运行随机数不同 call Randomize ; 输入第一个维度 mov edx, OFFSET prompt1 call WriteString call ReadInt ; 输入值存入EAX mov FirstDimension, eax ; 保存到变量 ; 输入第二个维度 mov edx, OFFSET prompt2 call WriteString call ReadInt mov SecondDimension, eax ; 计算矩阵元素总数:FirstDimension * SecondDimension mov eax, FirstDimension mul SecondDimension mov ecx, eax ; ECX = 元素数,用于循环填充 ; 填充m1矩阵(随机数0-15) mov ebx, OFFSET m1 ; EBX指向m1起始地址 mov esi, 0 ; 数组索引计数器 fill_m1: mov eax, 16 ; RandomRange生成0~n-1,16对应0~15 call RandomRange mov [ebx + esi*4], eax ; 存储到数组对应位置 inc esi loop fill_m1 ; 显示m1矩阵 mov eax, (black * 16) + red call SetTextColor mov ebx, OFFSET m1 ; 重新计算元素数(之前loop已将ECX减为0) mov eax, FirstDimension mul SecondDimension mov ecx, eax call DumpMem call Crlf ; 填充m2矩阵(随机数1-15) mov eax, FirstDimension mul SecondDimension mov ecx, eax mov ebx, OFFSET m2 mov esi, 0 fill_m2: mov eax, 15 ; 生成0~14,加1后变为1~15 call RandomRange add eax, 1 mov [ebx + esi*4], eax inc esi loop fill_m2 ; 显示m2矩阵 mov eax, (black * 16) + blue call SetTextColor mov ebx, OFFSET m2 mov eax, FirstDimension mul SecondDimension mov ecx, eax call DumpMem call Crlf ; 显示mp矩阵(初始值为0,可后续添加矩阵乘法逻辑) mov eax, (black * 16) + green call SetTextColor mov ebx, OFFSET mp mov eax, FirstDimension mul SecondDimension mov ecx, eax call DumpMem call Crlf Invoke ExitProcess, 0 main endp end main
关键修正点说明
- 输入逻辑修复:调用
ReadInt后将EAX的值存入维度变量,确保输入值被正确保存。 - 矩阵存储修正:定义足够大小的数组存储矩阵元素,避免单个变量的容量不足问题。
- 随机数填充逻辑:使用循环逐个填充矩阵元素,确保每个位置都被正确赋值。
- DumpMem 参数设置:调用前正确配置
EBX(起始地址)和ECX(元素数),避免非法内存访问。 - 寄存器使用规范:避免随意覆盖寄存器值,确保每一步操作的寄存器状态正确。
内容的提问来源于stack exchange,提问作者Emily B
相关产品推荐
相关产品推荐

