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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 04:06:07