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

8086汇编十六进制转十进制小写转大写错误修复及输入限制求解

汇编程序修复方案

原有问题原因

你代码中SUB DL,32H语句是核心问题在于:字符减30H后没有区分大小写就固定减32H,大写字母A-F减30H后的值为11H~16H,直接减32H会变成负数,完全破坏数值正确性。

修复逻辑说明

大小写转换逻辑修正

调整转换顺序,先判断输入字符的范围,分别处理:

  • 输入字符在30H~39H(对应0~9):直接减30H得到对应数值
  • 输入字符在41H~46H(对应AF):减`37H`得到1015的数值
  • 输入字符在61H~66H(对应af):直接减`57H`得到1015的数值,不会影响大写字母的转换结果

输入范围限制实现

每次读取字符后先做范围校验,不在合法区间外的字符会触发错误提示,要求用户重新输入,保证只有09、af、A~F的字符会进入转换逻辑。

修复后完整代码

#MAKE_EXE#

DSEG    SEGMENT 'DATA'  
MSG DB 'Enter a two-digit hexadecimal number: $'
ERR_MSG DB 0DH,0AH,'Invalid input, please enter 0-9/a-f/A-F: $'
DSEG    ENDS

SSEG    SEGMENT STACK   'STACK'
    DW      100h    DUP(?)  
SSEG    ENDS

CSEG    SEGMENT 'CODE'  

START   PROC    FAR 
PUSH    DS
MOV     AX, 0
PUSH    AX
MOV     AX, DSEG
MOV     DS, AX  

; 输出提示信息
MOV AH,09h      
MOV DX, OFFSET MSG
INT 21h

; 读取第一个十六进制字符,带校验
INPUT1:
MOV AH,1H       
INT 21H 
; 校验输入合法性判断
CMP AL, '0'
JB INVALID1
CMP AL, '9'
JBE CONV1
CMP AL, 'A'
JB INVALID1
CMP AL, 'F'
JBE CONV1_UPPER
CMP AL, 'a'
JB INVALID1
CMP AL, 'f'
JA INVALID1
; 小写字母转数值
SUB AL, 57H
JMP SAVE1
CONV1_UPPER:
SUB AL, 37H
JMP SAVE1
CONV1:
SUB AL, 30H
SAVE1:
MOV DL, AL
MOV CL,4H   
SHL DL,CL   

; 读取第二个十六进制字符,带校验
INPUT2:
MOV AH,1H       
INT 21H 
; 校验输入合法性
CMP AL, '0'
JB INVALID2
CMP AL, '9'
JBE CONV2
CMP AL, 'A'
JB INVALID2
CMP AL, 'F'
JBE CONV2_UPPER
CMP AL, 'a'
JB INVALID2
CMP AL, 'f'
JA INVALID2
; 小写字母转数值
SUB AL, 57H
JMP SAVE2
CONV2_UPPER:
SUB AL, 37H
JMP SAVE2
CONV2:
SUB AL, 30H
SAVE2:
ADD DL,AL

RET     

; 第一个字符输入非法处理
INVALID1:
MOV AH,09h
MOV DX, OFFSET ERR_MSG
INT 21h
JMP INPUT1

; 第二个字符输入非法处理
INVALID2:
MOV AH,09h
MOV DX, OFFSET ERR_MSG
INT 21h
JMP INPUT2
 
START   ENDP    

CSEG    ENDS    

    END    START 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:05