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

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
问题分析与修复方案

核心错误点

  1. 进制转换逻辑混乱:代码用十进制累加方式(乘10)处理二进制输入,导致输入1011时,计算出的数值是十进制的1011,而非二进制对应的11,加上'0'后超出ASCII有效范围,输出乱码。
  2. 无效代码冗余:inp2变量和tes分支逻辑完全未被使用,属于无效代码,徒增逻辑复杂度。
  3. 十六进制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:58:23