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,提问作者Завида
相关产品推荐
相关产品推荐

