You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编代码编译异常求助:第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:30:08