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
相关产品推荐
相关产品推荐

