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

汇编代码报错:无效操作码与操作数组合,求问题排查

错误排查与修正

核心错误点

  • div ax指令非法:8086汇编中,div指令的操作数不能是AX寄存器(除法操作里AX是被除数的低16位,DX是高16位,AX不能用作除数)。你的需求是将总和(AX)除以9,需把除数9放到其他16位寄存器(比如BX),再执行div bx。
  • 循环次数错误:even数组包含9个元素(16、18、20、22、24、26、28、30、32),但你设置cx=8,会少计算一个元素,导致总和错误。
  • 除法前未清零DX:16位除法的被除数是DX:AX组合,若总和是16位(未超65535),必须先将DX置0,否则DX的残留值会导致除法结果错误。

修正后的代码

[ORG 0x0100]

jmp  start

even: dw 16,18,20,22,24,26,28,30,32    
avg:  dw 0

average:     
a1: add  ax, [bx]    
    add  bx, 2    
    loop a1    
    ret

start:    
    mov ax,0    
    mov bx,even    
    mov cx,9          ; 修正循环次数为9
    call average    
    mov bx,9          ; 除数存入BX
    xor dx,dx         ; 清零DX,确保被除数为AX(DX:AX=0000h:AX)
    div bx            ; DX:AX除以BX,商存在AX,余数在DX
    mov avg,ax    
    mov ax, 0x4c00    ; 终止程序
    int 0x21

额外说明

  • div bx执行后,AX存储计算出的平均值(商),DX存储余数,符合需求。
  • 循环次数修正为9后,才能正确累加数组中所有元素的总和。

内容的提问来源于stack exchange,提问作者Vjdh Vnyg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:10:58