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
相关产品推荐
相关产品推荐

