emu8086中汇编代码无法输出输入数字且AL显示$$的原因是什么?
问题核心诱因
- 格式混用是导致AL显示$$的直接原因
你在代码开头写了org 100h,这是DOS下COM程序的专属配置,COM程序为单段结构,DS/CS/ES/SS默认指向同一段,不需要手动给DS寄存器赋值,也不需要使用.MODEL.DATA.CODE这类分段伪指令。但你后续编写的是EXE程序的分段逻辑,两种完全不同的程序格式混用导致段寄存器配置错误,调用INT 21H 01H号读取输入的中断逻辑执行异常,AL寄存器无法正常写入输入的字符值,就会显示$$的异常标识。 - 附加逻辑错误(格式修复后会触发)
代码中sub BL,48h的数值转换逻辑错误:字符'0'的ASCII码对应十进制48,十六进制为30h,你当前减去的48h对应十进制72,转换后的值完全不符合预期。且你将ASCII码转为数值后,没有转回ASCII码就直接调用INT 21H 02H号中断打印,会输出不可见控制字符。
修复方案
方案1:改用标准COM格式(代码更精简)
删除分段伪指令和DS赋值逻辑,保留org 100h,修正转换和打印逻辑即可:
org 100h ; COM程序为单段结构,数据直接放在代码段内 MSG DB "ENTER A NUMBER: $" MSG2 DB "HERE IS YOUR NUMBER: $" MAIN PROC ; 打印输入提示 MOV AH, 09h LEA DX, MSG INT 21H ; 读取用户输入,值自动存入AL MOV AH, 01h INT 21H mov BL, AL sub BL,30h ; 修正为减30h将ASCII转数值 ; 打印输出提示 MOV AH, 09h LEA DX, MSG2 INT 21H add BL,30h ; 打印前将数值转回ASCII码 mov DL,BL MOV AH, 02h INT 21H ret
方案2:改用标准EXE格式
删除开头的org 100h,保留原有分段逻辑,修正转换和打印逻辑即可。
内容的提问来源于stack exchange,提问作者Someguyy
相关产品推荐
相关产品推荐

