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

汇编十进制转八/十六进制程序优化:单次输入双输出需求

优化十进制转八进制/十六进制汇编程序:单次输入实现双转换

你当前的汇编程序存在重复提示用户输入的问题——Octal和Hex模块各自执行了输入逻辑,导致用户需要输入两次数值。我们可以通过将输入处理逻辑抽离为独立步骤,把转换后的二进制数值保存,再分别传入两个转换模块来解决这个问题。

旧代码核心问题

旧代码中Octal和Hex模块都重复执行了:

  • 提示输入(message1)
  • 读取输入字符串(int 21h ah=0ah)
  • 把ASCII字符串转成二进制数值的步骤

这就导致了两次输入提示,完全可以把这部分逻辑合并,只执行一次。

完整优化后的代码

.model small
.stack
.data
CR equ 13
lf equ 10
Introduction db cr,lf,09H,">>This Program converts Decimal into Hexadecimal and Octal Decimal<$"
Students db cr,lf,09H," >TEST<$"
Lab db cr,lf,09H,09H,09H,">>TEST<$"
Section db cr,lf,09h,09h,09h,09h,">>TEST<$"
Oct db cr,lf,0Ah,09H,">>Octal Decimal<$"
Hexa db cr,lf,0Ah,09H,">>Hexadecimal<$"
message1 db cr,lf,09H,"Enter a decimal number in a range of 0-65535: $"
message3 db cr,lf,0Ah,09H,09H, "Equivalent octal number is:$"
message4 db cr,lf,0Ah,09H,09H, "Equivalent hexadecimal number is:$"
Again db cr,lf,0Ah,09h,"Do you want to try again?(y/n)$"
Bye db cr,lf,0Ah,09H,09H,09H," >Thank you and Goodbye!<$"
Buffer dw 6
       dw 0
       dw 6 dup(0)
Multiplier dw 0ah
; 新增变量保存转换后的二进制数值
decimalValue dw ?

.code
org 100h
start:
    mov cx,0000h
    mov dx,184fh
    mov bh,21h
    mov ah,6
    int 10h
    mov dh,0
    mov dl,0
    mov bh,0
    mov ah,2
    int 10h

    mov ax,@data
    mov ds, ax

    lea dx,Introduction
    mov ah,9
    int 21h
    lea dx,Students
    mov ah,9
    int 21h
    lea dx,Lab
    mov ah,9
    int 21h
    lea dx,Section
    mov ah,9
    int 21h

    ; ========== 独立输入处理步骤:只执行一次 ==========
    lea dx,message1
    mov ah,09h
    int 21h

    ; 读取用户输入的十进制字符串
    mov ah, 0ah
    lea dx, Buffer
    int 21h

    ; 将ASCII字符串转换为二进制数值,保存到decimalValue
    mov si, offset Buffer + 2
    mov cl, byte ptr [si-1]
    mov ch, 00h
    mov ax, 0000h
ConvertToBinary:
    mul Multiplier
    mov bl, byte ptr [si]
    mov bh, 00h
    sub bl, 30h  ; ASCII转数字
    add ax, bx
    inc si
    loop ConvertToBinary
    mov decimalValue, ax  ; 保存转换后的二进制值

    ; ========== 调用八进制转换模块 ==========
    lea dx,Oct
    mov ah,9
    int 21h
    lea dx,message3
    mov ah,9
    int 21h
    mov ax, decimalValue
    call ConvertToOctal
    lea dx, Buffer + 2
    mov ah,9
    int 21h

    ; ========== 调用十六进制转换模块 ==========
    lea dx,Hexa
    mov ah,9
    int 21h
    lea dx,message4
    mov ah,9
    int 21h
    mov ax, decimalValue
    call ConvertToHex
    lea dx, Buffer + 2
    mov ah,9
    int 21h

    jmp Try

Try:
    lea dx,Again
    mov ah,9
    int 21h
    xor ah,ah
    int 16h
    mov bl,al
    mov dl,al
    mov ah,02h
    int 21h
    cmp bl,'Y'
    je start
    cmp bl,'y'
    je start
    cmp bl,'N'
    je stop
    cmp bl,'n'
    je stop

stop :
    lea dx,Bye
    mov ah,9
    int 21h
    mov ax,4C00h
    int 21h

; ========== 八进制转换子程序 ==========
ConvertToOctal proc
    mov bx, ax
    mov si, offset Buffer + 2
    mov ax, 8000h  ; 八进制最高位权重(对应二进制11位)
OctConvertLoop:
    mov cx, 0000h
OctCountBits:
    cmp bx, ax
    jb OctNextDigit
    sub bx, ax
    inc cx
    jmp OctCountBits
OctNextDigit:
    add cl, 30h
    mov byte ptr [si], cl
    inc si
    mov cx, 0008h
    div cx
    cmp ax, 0000h
    jnz OctConvertLoop
    mov byte ptr [si], '$'
    ret
ConvertToOctal endp

; ========== 十六进制转换子程序 ==========
ConvertToHex proc
    mov bx, ax
    mov si, offset Buffer + 2
    mov ax, 1000h  ; 十六进制最高位权重(对应二进制12位)
HexConvertLoop:
    mov cx, 0000h
HexCountBits:
    cmp bx, ax
    jb HexNextDigit
    sub bx, ax
    inc cx
    jmp HexCountBits
HexNextDigit:
    cmp cx, 0ah
    jb HexDigitNum
    add cl, 37h  ; 字母A-F
    jmp HexStoreDigit
HexDigitNum:
    add cl, 30h  ; 数字0-9
HexStoreDigit:
    mov byte ptr [si], cl
    inc si
    mov cx, 0010h
    div cx
    cmp ax, 0000h
    jnz HexConvertLoop
    mov byte ptr [si], '$'
    ret
ConvertToHex endp

end start

关键修改点说明

  1. 新增变量decimalValue:用来保存从输入字符串转换后的二进制数值,避免重复处理输入。
  2. 抽离输入处理逻辑:把原来在Octal和Hex模块里的输入、字符串转二进制逻辑合并成独立步骤,只执行一次。
  3. 封装转换为子程序:把八进制和十六进制转换逻辑封装成ConvertToOctal和ConvertToHex子程序,通过AX寄存器接收要转换的二进制数值,转换结果写入Buffer供输出使用。
  4. 调整流程顺序:先完成输入和数值转换,再依次调用两个转换子程序并输出结果,最后进入重试/退出逻辑。

这样修改后,程序只会提示用户输入一次数值,然后同时输出对应的八进制和十六进制结果,解决了重复输入的问题,同时代码结构更清晰、模块化。

内容的提问来源于stack exchange,提问作者gengencera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:36:02