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

8086处理器Intel汇编打印1-100奇数异常:仅输出到15后循环

解决8086汇编打印1-100奇数时输出到15后循环重置的问题

你描述的这个问题很典型,我之前帮朋友排查过类似的8086汇编bug,结合你的情况来拆解下:

问题根源推测

从输出到15后就回到1循环的现象来看,大概率是以下两个原因之一:

  • 循环变量用了8位寄存器且被意外溢出/修改:比如你一开始用AL存当前奇数,在处理输出时,某个操作(比如ASCII转换、调用DOS中断)不小心覆盖了AL的值;或者你误把多位数的处理逻辑写错,导致循环变量被重置为1。
  • 终止条件判断错误:比如你原本要判断是否小于等于100,结果写成了判断是否小于16,导致到15后就触发了错误的循环重置逻辑。

修正后的可运行代码

我整理了一份能正常打印1到100所有奇数的8086汇编代码,你可以参考:

; 8086汇编:打印1-100的奇数
.MODEL SMALL
.STACK 100H
.DATA
    SPACE DB ' ', '$'   ; 用于分隔数字的空格
    NEWLINE DB 0DH, 0AH, '$'  ; 换行符(可选)
.CODE
MAIN PROC
    ; 初始化数据段
    MOV AX, @DATA
    MOV DS, AX

    MOV BX, 1          ; BX作为循环变量,起始值为1
PRINT_LOOP:
    ; 打印当前奇数
    MOV AX, BX
    CALL PRINT_DECIMAL  ; 调用十进制数字打印子程序

    ; 打印分隔空格
    MOV AH, 09H
    LEA DX, SPACE
    INT 21H

    ; 计算下一个奇数
    ADD BX, 2
    ; 判断是否超过100,未超过则继续循环
    CMP BX, 101
    JBE PRINT_LOOP

    ; 程序退出
    MOV AH, 4CH
    INT 21H
MAIN ENDP

; 子程序:打印AX中的十进制数(支持多位数)
PRINT_DECIMAL PROC
    PUSH CX
    PUSH DX
    PUSH BX

    MOV CX, 0          ; 记录数字的位数
    MOV BX, 10         ; 除数为10
DIVIDE_STEP:
    XOR DX, DX         ; 清空DX,避免除法出错
    DIV BX             ; AX = AX / 10,DX = AX % 10(余数)
    PUSH DX            ; 余数入栈(逆序存储数字)
    INC CX
    CMP AX, 0          ; 判断是否还有高位
    JNE DIVIDE_STEP

PRINT_STEP:
    POP DX
    ADD DL, '0'        ; 将数字转换为ASCII码
    MOV AH, 02H
    INT 21H
    LOOP PRINT_STEP

    POP BX
    POP DX
    POP CX
    RET
PRINT_DECIMAL ENDP
END MAIN

核心修正说明

  • 用16位寄存器存循环变量:改用BX(16位)代替8位寄存器,避免后续操作意外覆盖或溢出;
  • 正确的循环终止判断:通过CMP BX, 101和JBE指令,确保当数值超过100时停止循环;
  • 完善的多位数打印逻辑:专门的PRINT_DECIMAL子程序能正确处理两位数(比如17、99)的输出,不会因为处理多位数时的逻辑错误导致循环变量被篡改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:10:55