求大神帮帮添加一个十六进制转十进制的功能在number 5这个地方汇编语言

DATAS SEGMENT
BUFFER DB 20 DUP(0)
BUFFER1 DB 20 DUP(0)
MSG1 DB "Please input you want choose number: $"
MSG2 DB "1: eg:A to a exchange : Uppercase to lowercase $"
MSG3 DB "2: eg:a to A exchange : Lowercase to Uppercase $"
MSG4 DB "3: eg:1111 to f : Binary to Hexadecimal $"
MSG5 DB "4: eg:f to 1111 : Hexadecimal to Binary $"
MSG6 DB "5: eg:f to 15 : Hexadecimal to Decimal $"
MSG7 DB "PLEASE INPUT SOME ALPHABET:$"
MSG8 DB "PLEASE INPUT SOME BINARY NUMBER:$"
MSG9 DB "PLEASE INPUT SOME HEX NUMBER:$"
DATAS ENDS

STACKS SEGMENT
STACKS ENDS


CODES      SEGMENT
           ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:     MOV AX,DATAS
           MOV DS,AX
P:  CALL  MENU           ;子程序调用
    CMP AL,'1'      
    JZ A                  ;      若 AL=1,则转到A 
    CMP AL,'2'
    JZ B                  ;     若AL=2,则转到B
    CMP AL,'3'
    JZ CA
    CMP AL,'4'
    JNZ LO
    JMP D

LO: CMP AL,'5'
    JNZ EXIT1
    JMP asd
EXIT1:JMP EXIT
A:  CALL CLEAR                 ;子程序调用
    MOV AH,02                    ;设置光标位置
    MOV DH,3             
    MOV DL,2             
    INT 10H                       ;中断指令
    MOV SI,OFFSET MSG7           ;取MSG7的地址指针送入SI
    MOV DX,SI
    MOV AH,09                     ;;显示一个字符串
    INT 21H
    LEA SI,BUFFER                 ;取BUFFER的有效地址给SI
S:  MOV AH,01                      ;;输入一个字符
    INT 21H
    MOV [SI],AL
    INC SI
    CMP AL,0DH                     ;;回车
    JNZ S                          ; ;若不输入回车,则继续执行S
    CALL CRLF
    MOV AH,02                      ; ;设置光标位置
    MOV DH,5
    MOV DL,28
    INT 10H
    LEA SI,BUFFER
Q:  MOV AL,[SI]
    CMP AL,'a' 
    JNB E                            ;  ;若AL的内容低于‘A’则转到E
    ADD AL,20H                ;  ;AL加上20H,大写字母转换为小写字母
    E: MOV DL,AL
    MOV AH,02                   ;   ;显示一个字符
    INT 21H           
    INC SI
    MOV AL,[SI]
    CMP AL,0DH
    JNZ Q                     ;   ;若不输入回车的话,则继续执行Q
    MOV AH,01
    INT 21H
    CMP AL,0DH
    JZ P                          ; ;若输入回车,则返回P
    JMP EXIT

R: MOV AX,47EH
MOV CX,0
MOV BX,10
DISP1: MOV DX,0
DIV BX
PUSH DX
INC CX
OR AX,AX
JNE DISP1
DISP2: MOV AH,2
POP DX
ADD DL,30H
INT 21H
LOOP DISP2

B:  CALL CLEAR                   ;调用子程序
    MOV AH,02
    MOV DH,3
    MOV DL,2
    INT 10H
    MOV SI,OFFSET MSG7
    MOV DX,SI
    MOV AH,09                      ; ;显示一个字符串
    INT 21H
    LEA SI,BUFFER
M:  MOV AH,01
    INT 21H
    MOV [SI],AL
    INC SI
    CMP AL,0DH
    JNZ M                         ;  ;若不输入回车,则继续执行M
    CALL CRLF
    MOV AH,02                     ;  ;设置光标位置
    MOV DH,5
    MOV DL,28
    INT 10H
    LEA SI,BUFFER
I:  MOV AL,[SI]
    CMP AL,5AH
    JNGE X                         ; ;若AL的内容低于‘Z’,则转到X
    SUB AL,20H                    ;  ;小写字母转换为大写字母
X:  MOV DL,AL
    MOV AH,02
    INT 21H
    INC SI
    MOV AL,[SI]
    CMP AL,0DH
    JNZ I
    MOV AH,01                      ;   ;输入一个字符
    INT 21H
    CMP AL,0DH
    JNZ EXIT0                       ; ;若不输入回车,则转到EXIT0出
    JMP P

EXIT0:JMP EXIT
CA: CALL CLEAR
MOV AH,02 ;;设置光标位置
MOV DH,3
MOV DL,2
INT 10H
MOV SI,OFFSET MSG8
MOV DX,SI
MOV AH,09
INT 21H
LEA SI,BUFFER
NAA: MOV AH,01
INT 21H
MOV [SI],AL
INC SI
CMP AL,0DH
JNZ NAA
CALL CRLF
LEA DI,BUFFER
MOV AH,02
MOV DH,5
MOV DL,28
INT 10H
Y: MOV AL,[DI]
SUB AL,30H ;;将ASCII码转换为二进制
MOV BL,8D
MUL BL
ADD AL,30H
MOV DL,0
ADD DL,AL
INC DI
MOV AL,[DI]
SUB AL,30H
MOV BL, 4D
MUL BL
ADD DL,AL
INC DI
MOV AL,[DI]
SUB AL,30H
MOV BL,2D
MUL BL
ADD DL,AL
INC DI
MOV AL,[DI]
SUB AL,30H
MOV BL,1D
MUL BL
ADD DL,AL
CMP DL,'9'
JNG T
ADD DL,'A'-':'
T: MOV AH,02
INT 21H
INC DI
MOV AL,[DI]
CMP AL,0DH
JNZ Y
MOV AH,01
INT 21H
CMP AL,0DH
JNZ EXIT
JMP P
D: CALL CLEAR
MOV AH,02
MOV DH,3
MOV DL,2
INT 10H
MOV SI,OFFSET MSG9
MOV DX,SI
MOV AH,09
INT 21H
LEA SI,BUFFER

asd: CALL CLEAR;;;;;;;;;;;;;;;;;;;;number5这个地方
MOV AH,02
MOV DH,3
MOV DL,2
INT 10H
MOV SI,OFFSET MSG9
MOV DX,SI
MOV AH,09
INT 21H
LEA SI,BUFFER

FF: MOV AH,01
INT 21H
MOV [SI],AL
INC SI
CMP AL,0DH
JNZ FF
CALL CRLF
LEA SI,BUFFER
MOV DI,OFFSET BUFFER1
RE: MOV AL,[SI]
CMP AL,'9'
JNG Z
SUB AL,'A'-':'
Z: SUB AL,30H
MOV CX,4
ADD DI,4
YU: CBW
MOV BL,2D
DIV BL
MOV [DI],AH
PUSH AX
ADD AH,30H ; ; 二进制转化为ASCII码
POP AX
DEC DI
LOOP YU
ADD DI,4
INC SI
MOV AL,[SI]
CMP AL,0DH
JNZ RE
INC DI
MOV AL,'$'
MOV [DI],AL
CALL CRLF
MOV SI,OFFSET BUFFER1+1
MOV AL,[SI]
RT: ADD AL,30H
MOV DL,AL
MOV AH,02
INT 21H
INC SI
MOV AL,[SI]
CMP AL,'$'
JNZ RT
MOV AH,01
INT 21H
CMP AL,0DH
JNZ EXIT
JMP P
EXIT: MOV AH,4CH
INT 21H ;返回DOS系统

MENU PROC NEAR
CALL CLEAR ;调用子程序
MOV AH,02 ;设置光标位置
MOV DH,5 ;第5行
MOV DL,25 ;第25列
INT 10H
LEA SI,MSG2
MOV DX,SI
MOV AH,09 ;显示MSG2的内容
INT 21H ;输出MSG2字符串
MOV AH,02 ;至光标位置
MOV DH,7 ;第7行
MOV DL,25 ;第25列
INT 10H
LEA SI,MSG3 ;取MSG3的有效地址
MOV DX,SI
MOV AH,09
INT 21H ;输出MSG3字符串
MOV AH,02
MOV DH,9 ;第9行
MOV DL,25 ;第25列
INT 10H
LEA SI,MSG4 ;取MSG4的有效地址
MOV DX,SI
MOV AH,09
INT 21H ;输出MSG4字符串
MOV AH,02
MOV DH,11 ;第11行
MOV DL,25 ;第25列
INT 10H
LEA SI,MSG5
MOV DX,SI
MOV AH,09
INT 21H ;输出MSG5字符串
MOV AH,02 ;至光标位置
MOV DH,13 ;第15列
MOV DL,25 ;第17列
INT 10H
LEA SI,MSG6
MOV DX,SI
MOV AH,09
INT 21H ;输出MSG6字符串
MOV AH,02 ;至光标位置
MOV DH,19 ;第19列
MOV DL,25 ;第25列
INT 10H
LEA SI,MSG1
MOV DX,SI
MOV AH,09
INT 21H ;输出MSG1字符串
MOV AH,01 ;键盘输入
INT 21H
RET ;返回
MENU ENDP
CLEAR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV AH,07 ;屏幕初始化或下卷
MOV AL,25 ;下卷行数
MOV BH,70H ;卷入行属性
MOV CH,0 ;左上角行号
MOV CL,0 ;左上角列号
MOV DH,24 ;右下角行号
MOV DL,79 ;右下角列号
INT 10H
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
CLEAR ENDP

CRLF PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV DL,0DH ;输出回车
MOV AH,02
INT 21H
MOV DL,0AH ;输出换行
MOV AH,02
INT 21H
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
CRLF ENDP
CODES ENDS ;代码段结束
END START ;程序结束

2个回答

你是哪个寄存器的值要变十进制,所谓的变十进制是吧数据用十进制的样子打印出来吗?

tang_cheng
tang_cheng 你是要做16进制字符串到10进制字符串的转换是吧?好多年没用了,汇编指令记忆比较模糊了,就尝试着给你写思路性的代码你参考一下吧
大约 3 年之前 回复
Athusatic
Athusatic 回复tang_cheng: 麻烦你下 要是会的话看一下我这个5号功能想让他输入一个16进制数 转换成10进制的 这个貌似放在一个缓冲区中然后取出来
大约 3 年之前 回复
tang_cheng
tang_cheng 你还真厉害啊,这么古老的DOS时代用INT 21H输出的代码今天都能看到,我还以为早失传了呢
大约 3 年之前 回复
HEX_STR  DB '1AH'   ; 模拟源数据


;将16进制字符串转换成数据,保存到[ESP-4]中

; 原始值清空
MOV AX, 0 
MOV [ESP-4], AX

START:

; 从外部输入接收字符,保存在AX
.... 代码略

; 如果输入回车则结束
CMP AX, 13H
JZ OUTPUT

; 如果输入小于等于'9'则转换0-9
CMP AX, '9'
Jxx(大于) NEXT_CONV_1

; 转换0-9
SUB AX, '0'
JMP SAVE_CONV

NEXT_CONV_1:
; 如果输入小于等于'F'则转换A-F
CMP AX, 'F'
Jxx(大于) NEXT_CONV_2

; 转换A-F
SUB AX, 'A'
JMP SAVE_CONV

NEXT_CONV_2:
; 如果输入小于等于'f'则转换a-f
CMP AX, 'f'
Jxx(大于) NEXT_CONV_2

; 转换a-f
SUB AX, 'f'

SAVE_CONV:
;将输入的数值合并到[ESP-4]中
MOV BX, [ESP - 4]
SHL BX, 4
ADD BX, AX
MOV [ESP-4],BX

JMP START

OUTPUT:
写汇编太累了,我下面就不写代码说一下思路了

就是循环获取[ESP-4]里的值,然后DIV 10, 将结果保存回[ESP-4],余数 + '0'作为字符串输出,直至[ESP-4]里的值为0则结束


Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问