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

emu8086环境下汇编实现八进制转十六进制的代码合并咨询

八进制转十六进制emu8086汇编实现方案

以下是合并两份代码后的完整可运行代码,直接实现八进制输入到十六进制输出的功能,无需中间转换步骤,可直接在emu8086环境运行:

.MODEL SMALL
.STACK 100H
.DATA
    INP DB 20 DUP(0) ; 扩大输入缓冲区,支持最多20位八进制输入
    MSG_1 DB "请输入一个八进制数: $"
    MSG_2 DB "转换后的十六进制数为: $"
    MSG_3 DB "输入非法!仅允许输入0-7的字符。 $"
.CODE
MAIN PROC
    MOV AX,@DATA
    MOV DS,AX
    
    ; 输出输入提示
    LEA DX,MSG_1
    MOV AH,9
    INT 21H
    
    MOV SI,0
    MOV CX,0
    XOR BX,BX ; 用来存储转换后的二进制数值
INPUT:
    MOV AH,1
    INT 21H
    CMP AL,13 ; 按下回车键结束输入
    JE INPUT_END
    ; 校验输入合法性,必须为0-7的字符
    CMP AL,'0'
    JL INVALID
    CMP AL,'7'
    JG INVALID
    ; 存储输入字符
    MOV INP[SI],AL
    INC SI
    INC CX
    ; 将当前八进制位累加到BX:BX左移3位,加上当前位的数值
    SUB AL,48
    SHL BX,3
    OR BL,AL
    JMP INPUT
INPUT_END:
    CALL NEWLINE
    CALL NEWLINE
    
    ; 输出十六进制结果提示
    LEA DX,MSG_2
    MOV AH,9
    INT 21H
    
    ; 转换BX中的数值为十六进制输出,支持最多4位十六进制
    MOV CX,4
PRINT_HEX:
    ROL BX,4 ; 循环左移4位,将待输出的4位移到最低位
    MOV DL,BL
    AND DL,0FH ; 提取低4位
    CMP DL,9
    JLE PRINT_NUM
    ; 大于9的数值转换为A-F
    ADD DL,55
    JMP PRINT_CHAR
PRINT_NUM:
    ADD DL,48
PRINT_CHAR:
    MOV AH,2
    INT 21H
    LOOP PRINT_HEX
    
    ; 正常退出程序
    MOV AH,4CH
    INT 21H
INVALID:
    CALL NEWLINE
    CALL NEWLINE
    LEA DX,MSG_3
    MOV AH,9
    INT 21H
    MOV AH,4CH
    INT 21H
MAIN ENDP

; 换行子程序
NEWLINE PROC
    MOV AH,2
    MOV DL,10
    INT 21H
    MOV DL,13
    INT 21H
    RET
NEWLINE ENDP
END

核心修改说明

  • 统一了两份原始代码的段定义,扩大了输入缓冲区大小,支持更长的八进制数输入
  • 新增了八进制输入合法性校验,输入非0-7的字符会直接提示错误
  • 去掉了中间二进制输出的环节,直接将每个八进制位转换成3位二进制累加到寄存器BX中,减少不必要的IO操作
  • 优化了十六进制输出逻辑,从原代码仅支持1位十六进制输出升级为支持4位(对应16位二进制),覆盖更大的数值范围
  • 保留了原有代码的换行、系统调用逻辑,完全兼容emu8086运行环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:36:04