今天编写了一个
输入二进制串并转换为16进制数显示到屏幕
的汇编程序
在编写过程中遇到一些问题,并解决后,想把它与大家分享。
题目是这样的:
分析题目:
可得要求
输入 11111111
得到 00FFH
那么思路就是:
0.输入类似11111111的8位二进制
1.对输入的字符串要转换为对应的数字0,1二进制存在内存中。
2.对输入的字符串可通过8421方法计算10进制存到AX。
3.输出AX
那么代码:
do8421:
;计算每4位的8421之和
MOV AL,8
MUL TEMP[BX]
ADD S8421,AL
MOV AL,4
MUL TEMP[BX+1]
ADD S8421,AL
MOV AL,2
MUL TEMP[BX+2]
ADD S8421,AL
MOV AL,1
MUL TEMP[BX+3]
ADD S8421,AL
RET
第0步:输入类似11111111的8位二进制
; 输入8位二进制数的字符串到TEMP
MOV DX,OFFSET TEMP
MOV AH,0AH
INT 21H
第1步:对输入的字符串要转换为对应的数字0,1二进制存在内存中。
; 将TEMP中16进制数字符串转为二进制(对应字符转数字ascll)
MOV CX,9;有8位
TO:
;将字符0,1转为数字0,1
MOV BX,CX
;去除第一二单元
SUB TEMP[BX+1],48
LOOP TO
第2步:对输入的字符串可通过8421方法计算10进制存到AX。
;每4位做8421转换
;高4位之和
MOV BX,2;
CALL do8421
;暂存
MOV DH,S8421
MOV CL,4
SHL DH,CL
;清零
MOV S8421,0
;低4位之和
MOV BX,6
CALL do8421
;求OR得到16进制数到AL10
MOV AL,DH
OR AL,S8421
第3步:输出AX
; AH清零
SUB AH,AH
;输出do8421的值->Temp16
MOV SI,OFFSET Temp16+3;保存存储结果的字符串的最后一个字符偏移地址
XOR CX,CX
MOV CL,4
MainPart:
;输出最终字符结果
MOV DH,AL ;将Al的内容传送给DH
SHR AX,1
SHR AX,1
SHR AX,1
SHR AX,1
AND DH,0FH
ADD DH,48
CMP DH,':' ;':'的ASCII比9大1 而字母的ASCII码与数字的ASCII码中间隔了7个其它字符
JA isLetter ;如果为字母则跳转
JB No ;如果不是
isLetter:
ADD DH,07H ;ASCII码加7变为字母
No:
MOV [SI], DH ;将字符存入,待存放内容的字符串的对应位置
DEC SI ;待存放内容的内存地址自减1
LOOP MainPart
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
; LEA DX, Temp16
MOV DX,OFFSET Temp16
MOV AH,09H
INT 21H
给出完整代码:
;@author:joker
;@date: 2020-5-12
;@description: 第十次作业第二题;输入8位二进制数转16进制数输出;利用BCD8421
DATA SEGMENT
TEMP DB 9,0,9 DUP(0);存进制数&回车
Temp16 DB "****H$";存放字符形式的2位16进制(8位二进制)
S8421 DB 0;存储每4位16进制数;高低4位
INPUT DB "the symbol =(0 | 1),length=8,other=error$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
do8421:
;计算每4位的8421之和
MOV AL,8
MUL TEMP[BX]
ADD S8421,AL
MOV AL,4
MUL TEMP[BX+1]
ADD S8421,AL
MOV AL,2
MUL TEMP[BX+2]
ADD S8421,AL
MOV AL,1
MUL TEMP[BX+3]
ADD S8421,AL
RET
STRAT:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INPUT
MOV AH,09H
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
; 输入8位二进制数的字符串到DX->TEMP
MOV DX,OFFSET TEMP
MOV AH,0AH
INT 21H
; 将TEMP中16进制数字符串转为二进制(对应字符转数字ascll)
MOV CX,9;有8位
TO:
;将字符0,1转为数字0,1
MOV BX,CX
;去除第一二单元
SUB TEMP[BX+1],48
LOOP TO
;每4位做8421转换
;高4位之和
MOV BX,2;
CALL do8421
;暂存
MOV DH,S8421
MOV CL,4
SHL DH,CL
;清零
MOV S8421,0
;低4位之和
MOV BX,6
CALL do8421
;求OR得到16进制数到AL10
MOV AL,DH
OR AL,S8421
; AH清零
SUB AH,AH
;输出do8421的值->Temp16
MOV SI,OFFSET Temp16+3;保存存储结果的字符串的最后一个字符偏移地址
XOR CX,CX
MOV CL,4
MainPart:
;输出最终字符结果
MOV DH,AL ;将Al的内容传送给DH
SHR AX,1
SHR AX,1
SHR AX,1
SHR AX,1
AND DH,0FH
ADD DH,48
CMP DH,':' ;':'的ASCII比9大1 而字母的ASCII码与数字的ASCII码中间隔了7个其它字符
JA isLetter ;如果为字母则跳转
JB No ;如果不是
isLetter:
ADD DH,07H ;ASCII码加7变为字母
No:
MOV [SI], DH ;将字符存入,待存放内容的字符串的对应位置
DEC SI ;待存放内容的内存地址自减1
LOOP MainPart
MOV AH,02H
MOV DL,0AH
INT 21H
MOV AH,02H
MOV DL,0DH
INT 21H
; LEA DX, Temp16
MOV DX,OFFSET Temp16
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END STRAT
完。
加油!相信自己!
提示:代码虽好,但步骤同样重要,动手更重要!