汇编十进制转八/十六进制程序优化:单次输入双输出需求
优化十进制转八进制/十六进制汇编程序:单次输入实现双转换
你当前的汇编程序存在重复提示用户输入的问题——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
关键修改点说明
- 新增变量
decimalValue:用来保存从输入字符串转换后的二进制数值,避免重复处理输入。 - 抽离输入处理逻辑:把原来在
Octal和Hex模块里的输入、字符串转二进制逻辑合并成独立步骤,只执行一次。 - 封装转换为子程序:把八进制和十六进制转换逻辑封装成
ConvertToOctal和ConvertToHex子程序,通过AX寄存器接收要转换的二进制数值,转换结果写入Buffer供输出使用。 - 调整流程顺序:先完成输入和数值转换,再依次调用两个转换子程序并输出结果,最后进入重试/退出逻辑。
这样修改后,程序只会提示用户输入一次数值,然后同时输出对应的八进制和十六进制结果,解决了重复输入的问题,同时代码结构更清晰、模块化。
内容的提问来源于stack exchange,提问作者gengencera
相关产品推荐
相关产品推荐

