TASM1.4中4位二进制转十六进制输出异常问题求助
问题描述
在TASM 1.4汇编环境中尝试获取4位二进制输入并转换为对应十六进制值时,输出结果错误。例如输入1011,预期返回11,实际得到#或[这类乱码字符。
错误代码
.model small .stack .data CR EQU 10 LF EQU 13 inp1 db CR, LF, CR, LF, "Enter a number: $" inp2 dw 0 count db 0 .code tes: cmp count, 1 je add8 cmp count, 2 je add4 cmp count, 3 je add2 cmp count, 4 je add1 add8: add word ptr inp2, 8 add4: add word ptr inp2, 4 add2: add word ptr inp2, 2 add1: add word ptr inp2, 1 jmp conti START: MOV AX, @DATA MOV DS, AX mov dx, OFFSET inp1 mov ah, 09h int 21h mov bx, 0 start1: mov ah, 01h int 21h cmp al, 0dh je end1 inc count sub ah, 30h cmp ah, 1 je tes conti: mov ah, 0 sub al, 30h push ax mov ax, 10d mul bx pop bx add bx, ax jmp start1 end1: mov ax, bx mov dx, 0 add ax, '0' ; Convert the result to ASCII character mov dl, al mov ah, 02h int 21h mov ah, 4ch ; Terminate the program int 21h end START
问题分析与修复方案
核心错误点
- 进制转换逻辑混乱:代码用十进制累加方式(乘10)处理二进制输入,导致输入
1011时,计算出的数值是十进制的1011,而非二进制对应的11,加上'0'后超出ASCII有效范围,输出乱码。 - 无效代码冗余:
inp2变量和tes分支逻辑完全未被使用,属于无效代码,徒增逻辑复杂度。 - 十六进制ASCII转换不完整:仅处理了0-9的数值转ASCII,未覆盖10-15对应的'A'-'F'转换,导致大于9的数值输出错误字符。
修复后的代码
.model small .stack .data CR EQU 10 LF EQU 13 inp1 db CR, LF, CR, LF, "Enter 4-bit binary number: $" .code START: MOV AX, @DATA MOV DS, AX ; 输出输入提示 mov dx, OFFSET inp1 mov ah, 09h int 21h mov bx, 0 ; 存储二进制转换后的数值 mov cx, 4 ; 限制输入4位二进制数 start1: mov ah, 01h int 21h cmp al, 0dh je end1 ; 按回车提前结束输入 ; 校验输入只能是0或1 cmp al, '0' jb start1 cmp al, '1' ja start1 ; 二进制转数值:左移一位(等价乘2),加上当前位值 shl bx, 1 sub al, '0' add bl, al loop start1 ; 输入满4位自动结束 end1: ; 将数值转换为十六进制ASCII mov al, bl cmp al, 10 jb to_digit ; 小于10转为数字字符 ; 大于等于10转为A-F字符 add al, 'A' - 10 - '0' to_digit: add al, '0' mov dl, al mov ah, 02h int 21h ; 终止程序 mov ah, 4ch int 21h end START
修复说明
- 正确的二进制转数值:用
shl bx,1实现左移(等价乘2),叠加当前位的0或1,准确计算4位二进制对应的0-15数值。 - 输入校验与限制:添加4位输入限制,同时校验输入只能是0或1,避免非法输入干扰结果。
- 完整的十六进制转换:区分0-9和10-15的ASCII转换逻辑,确保输出正确的数字或字母。
- 精简代码:移除所有无效变量和分支,简化逻辑结构。
内容的提问来源于stack exchange,提问作者Kookaburra
相关产品推荐
相关产品推荐

