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

