上汇编课,老师给我们出了一题:
输入一个十进制数字串(假定是无符号的),以四位十六进制的形式输出该串对应的值
想了一下,感觉好难,该怎么处理把字符串转换为十进制数,还有怎么把十进制数转换为十六进制,想了半天没有头
在网上搜了一下,看到了一个解法,(点击打开链接), 不过感觉有些代码略繁琐而且对一位的字符输入会有错误输出,算是一个bug,
于是忍不住进行了修改,修改了bug而且代码少了不少也清晰了很多:
.386
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT USE16
BUF1 DB 20
DB ?
DB 20 DUP(0); buf1用来存储用户输入的字符串
BUF2 DB 20
DB ?
DB 20 DUP(30H); buf2用来存储输出的结构 每个字节默认为字符'0'
INPUT DB 'Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'; 提示语,换号符
X1 DW 0AH
X2 DW 10H ; 进制转换用的乘法或者除法因子
DATA ENDS
CODE SEGMENT USE16
ASSUME DS: DATA, CS: CODE, SS: STACK
START: MOV AX, DATA
MOV DS, AX
LEA DX,INPUT
MOV AH,9
INT 21H; 输出'input:'提示语
LEA DX, BUF1
MOV AH, 10
INT 21H; 把输入的存在buf1中
LEA DX, CTRL
MOV AH, 9
INT 21H; 输出回车换行
MOV CL, BUF1+1; cl存储输入字符个数
LEA SI, BUF1+2; 输入字符首地址
MOV AX, 0
LOOPA:
MUL [X1]
MOV BL, [SI]
SUB BL, 30H; ascii 码转换为数字
MOV BH, 0
ADD AX, BX
INC SI
DEC CL
JNZ LOOPA
; loopa 循环把输入的字符串转换为数字存到dx, ax中 dx为高字节,ax为低字节
MOV CL, 0
LOOPB:
DIV [X2]
PUSH DX;入栈
INC CL
MOV DX, 0
CMP AX, 0
JNE LOOPB
; loopb 循环把十进制转换为16进制数,每一16进制位压入栈
MOV AL, 4
SUB AL, CL
MOV AH, 0
LEA SI, BUF2+2
ADD SI, AX
LOOPC:
POP AX
CMP AX, 9
JBE NUM
ADD AX, 7H
NUM: ADD AX, 30H
MOV [SI], AX
INC SI
DEC CL
JNE LOOPC
; loopc 循环把栈中的16进制数字转换为ascii码存到buf2中
MOV [SI], BYTE PTR 'H'
INC SI
MOV [SI], BYTE PTR '$'
; buf2 的结尾加上'h$'
LEA DX,OUTPUT
MOV AH,9
INT 21H; 输出'output'提示
LEA DX, BUF2
MOV AH, 9
INT 21H; 输出最终结果
MOV AH, 4CH
INT 21H
CODE ENDS
END START