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

EMU 8086数组元素读取存值错误及div指令溢出问题求解

8086汇编程序异常修复方案

问题根源分析

两个异常存在直接关联,核心是段寄存器初始化缺失,同时存在循环逻辑、语法细节错误:

  • 第一个异常(AL存入CDh):.model small 模式下程序启动时,DS 段寄存器默认指向程序段前缀(PSP),并未指向你定义的.data数据段,你读到的CDh是PSP首地址的固定值,不是数组的实际元素。
  • 第二个异常(div指令溢出):CDh最高位为1,经CBW符号扩展后AX值为FFCDh,除以2的商远超过8位AL能存储的最大无符号数0FFh,因此触发除法溢出中断,属于第一个异常的衍生问题。

另外存在两个隐藏错误:

  • 循环次数配置错误:每次SI加2遍历偶数索引,8个元素的数组只有4个偶数索引项,CX赋值为len=8会导致数组越界访问。
  • 语法错误:je next: 里的冒号属于标签next,不能写在跳转语句中,会导致汇编阶段语法解析异常。

修复后完整代码

.model small
.data
nizA db 1,2,3,4,5,6,7,8   
nizB db 8 dup(?)
len equ 8
.code   
main proc
    ; 初始化DS段寄存器指向数据段,解决取数异常问题
    mov ax,@data
    mov ds,ax

    mov si,0
    mov di,0
    ; 循环次数改为len/2,仅遍历偶数索引项
    mov cx,len/2

program: 
    mov al,nizA[si]
    cbw
    mov bl,2
    div bl
    cmp ah,0
    ; 移除跳转语句后的多余冒号
    je next
    input:
        mov nizB[di],al
        inc di
next:
    add si,2
    loop program

    ; 新增程序正常退出逻辑,避免执行跑飞
    mov ah,4ch
    int 21h
endp
end

优化建议

判断数值奇偶无需使用除法指令,直接用test al,1判断最低位即可,性能更高且不存在溢出风险,替换逻辑如下:

mov al,nizA[si]
test al,1
jz next ; 最低位为0是偶数,直接跳过
mov nizB[di],al
inc di
next:

内容的提问来源于stack exchange,提问作者Завида

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:12:00