汇编代码报错:无效操作码与操作数组合,求问题排查
错误排查与修正
核心错误点
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
相关产品推荐
相关产品推荐

