汇编代码编译异常求助:第25行抛异常,写入数值1失败
解决汇编代码中
MOV dword ptr [esi], 1的内存访问异常问题 看起来你在这段处理矩阵的循环汇编代码里栽了跟头,问题出在MOV dword ptr [esi], 1这一行触发的内存访问异常对吧?结合你的代码逻辑,我帮你梳理几个最可能的原因和对应的排查、修复思路:
可能的问题根源
1. ESI指向的内存地址不可写或非法
ESI里存的是矩阵的起始地址,但如果这个地址属于只读内存段(比如程序的.text代码段),或者经过循环计算后超出了矩阵的合法范围,写入操作必然会触发异常。
- 排查方法:用调试器在
_conditie标签处设置断点,执行到这里时查看ESI的具体值,然后检查该地址是否在程序的可写内存区域(比如.data/.bss段、栈或堆空间)。如果矩阵是在.text段定义的,赶紧把它移到.data段(可写)。
2. 循环中的地址计算逻辑错误
看你的循环逻辑:每次循环都会SUB ebx,4,当edx归0时进入_conditie分支,重置edx=5后再SUB ebx,4。这里要重点核对:
- ebx的初始值是否等于矩阵的总字节数?比如如果是5行5列的dword矩阵,总字节数是
5*5*4=100,ebx初始值就该是100。 - 会不会在多次循环后,ESI累加的偏移量超过了矩阵的总大小?比如ebx提前变成负数但循环没终止,导致ESI指向矩阵外的非法地址。
3. 编译环境的模式不匹配
虽然你用了32位寄存器(EBX、ESI、EDX),但如果编译环境意外处于16位模式,dword ptr的寻址可能会出问题——不过这个概率比较小,还是优先排查前两个问题。
修复示例代码
假设你的矩阵是5x5的dword数组,我调整了代码的初始化部分,确保内存区域合法、循环条件正确:
; 数据段:定义可写的矩阵 .data matrix dd 25 dup(0) ; 5x5的dword矩阵,共25个元素 ; 代码段 .code _start: mov esi, offset matrix ; ESI指向矩阵起始地址 mov ebx, 25 * 4 ; ebx初始值为矩阵总字节数(25个dword ×4字节) mov edx, 5 ; 每行的元素个数 _while: cmp ebx, 0 jb _end_while ; ebx<0时终止循环 cmp edx, 0 je _conditie mov [esi], 0 ; 写入0 add esi, 4 dec edx sub ebx, 4 jmp _while _conditie: mov dword ptr [esi], 1 ; 现在ESI指向合法的可写地址 add esi, 4 mov edx, 5 ; 重置每行元素计数器 sub ebx, 4 jmp _while _end_while: ; 后续执行逻辑
最后建议
优先用调试器跟踪ESI和EBX的变化,这是定位内存访问问题最直接的方法——看每次循环后ESI的地址是否还在矩阵的合法范围内,ebx的递减是否符合预期。
内容的提问来源于stack exchange,提问作者Matei Acsinte
相关产品推荐
相关产品推荐

