DOSBox下汇编程序打印二进制数异常问题求助
问题分析与修复方案
你的汇编代码存在两个核心问题,导致无法正确打印二进制数、反而输出空格(不可见字符),以下是具体问题和修复步骤:
1. 二进制位未转换为ASCII字符
你在转换二进制位时,直接将数值0或1存入binForm,但DOS打印函数识别的是ASCII编码字符:
- ASCII中'0'的编码是
30h(十进制48),'1'是31h(十进制49) - 你存入的
0对应ASCII空字符(NUL),1对应SOH,DOS下这些字符会显示为空格
修复逻辑:
修改convert_to_binary段的位转换代码,将数值转换为对应的ASCII字符:
convert_to_binary: rol al, 1 ; 左循环取出最高位到进位标志 mov bh, '0' ; 先初始化为ASCII的'0' adc bh, 0 ; 若有进位,'0'加1变为'1' mov [di], bh ; 将ASCII字符存入binForm inc di ; 移动到下一个位置 loop convert_to_binary
也可以用等价写法:
convert_to_binary: rol al, 1 mov bh, 0 adc bh, '0' ; 直接将进位值加到'0'上得到对应ASCII字符 mov [di], bh inc di loop convert_to_binary
2. 字符串打印包含冗余符号
你的string定义带有$符号:string db 'HELLO WORLD$', 0,但你用lodsb逐个字符打印时,会把$也输出(直到遇到0才停止)。如果不需要打印$,应移除该符号:
string db 'HELLO WORLD', 0 ; 移除多余的$符号
完整修复后的代码
org 100h number db 0AFh ; 要显示的8位二进制数 string db 'HELLO WORLD', 0 ; 待转换并显示的字符串 binForm db '00000000$', 0 ; 二进制格式占位符 start: ; 将数字转换为二进制格式 mov cx, 8 ; 处理8个比特位 mov al, number mov di, binForm ; 指向binForm的起始地址 convert_to_binary: rol al, 1 ; 左循环,将当前最高位移到进位标志 mov bh, '0' ; 初始化为ASCII的'0' adc bh, 0 ; 加上进位值,得到'0'或'1' mov [di], bh ; 保存ASCII字符到binForm inc di ; 移动到下一个字节 loop convert_to_binary ; 打印二进制格式 mov ah, 09h mov dx, binForm ; 指向binForm int 21h ; 换行 mov dl, 13 mov ah, 02h int 21h mov dl, 10 int 21h ; 转换并打印字符串 mov si, string print_string: lodsb ; 将字符串字节加载到AL or al, 20h ; 转换为小写 cmp al, 0 ; 检查是否为终止符0 je done ; 是则跳转到结束 mov ah, 02h int 21h ; 打印字符 jmp print_string ; 循环处理下一个字符 done: mov ax, 4C00h ; 退出到DOS int 21h
运行效果
修复后,代码会先输出10101111(对应0AFh的二进制),然后换行输出小写的hello world,最后正常退出DOSBox环境。
内容的提问来源于stack exchange,提问作者Terrible Terror
相关产品推荐
相关产品推荐

