用汇编实现二进制数和十六进制数的相互转换
用汇编实现二进制数向十六进制数的转换一、实现功能1)实现二进制数向十六进制数的转换2)实现十六进制数向二进制数的转换‘二、设计分析 汇编语言中,字符在机器中都是以ascii码的二进制格式存储,但是汇编语言写的时候常用十六进制,因此需要好好看看ascii码的十六进制表。 特别是进制转换一定要注意,机器中存储的是数的二进制数
·
用汇编实现二进制数向十六进制数的转换
一、实现功能
1)实现二进制数向十六进制数的转换
2)实现十六进制数向二进制数的转换‘
二、设计分析
汇编语言中,字符在机器中都是以ascii码的二进制格式存储,但是汇编语言写的时候常用十六进制,因此需要好好看看ascii码的十六进制表。
特别是进制转换一定要注意,机器中存储的是数的二进制数本身,而我们输入输出的是数的ascii码的值,因此注意对寄存器中数的加减操作。
四位二进制数对应一位十六进制数,这里写的也是四位二进制和一位十六进制之间的的转换。
- 先输入四位的二进制数,每输入一位二进制数就判断输入的时0还是1,即将该数和30H做比较。
- 将DL赋值为0。如果输入的数是0,则将DL和0进行或运算(也可以不进行逻辑运算直接移位),将DL的最后一位置为0;如果输入的数是1,则将DL和1进行或运算,将DL的最后一位置为1。然后将DL向左移一位。进行4次循环,级输入4为二进制数。四位输入完毕后,DL就得到输入数的二进制。
- 判断DL是否在0-9之间,如果在则ADD DL,30H;如果大于0-9,则ADD DL,37H。(注意输出的字符的值是不等于机器中存放的二进制的值,因此需要进行加法)最后输出对应的16进制的ascii码的值。如果小于0-9则JMP到程序开始重新输入功能序号。
- 二进制转十六进制的流程图:
- 先输入一个16进制数,判断输入字符的ascii码在30H-39H(0-9)之间,还是在41H-46H(A-F)之间,或者是在61H-66H(a-f)之间。如果是第一种情况则SUB DL,30H,如果是第二种情况则SUB DL,37H,如果是第三种情况则SUB DL,57H。即可得到输入的十六进制数的值,而不是字符的ascii码的值。
- 最后需要将DL中的值以二进制输出,因为机器里存放的就是以二进制存放。这里我用循环左移的方式,从二进制的高位到低位一次循环打印。将循环左移一位后的数与1进行与运算,得到最低位的大小(也就是当前准备输出的位置的大小),然后加上30H,得到0/1的ascii码值,依次将DL的值进行输出。
- 需要注意,第2步进行与运算的时候不能再原来的寄存器上进行,否则只能得到一位二进制数,后面几位都没法求了。
- 一个十六进制数向二进制数的转换流程图:
三、设计分析
四位二进制数向十六进制数的转换
DATA SEGMENT
TIP DB 'INPUT THE NUMBER: ','$'
TIP1 DB ' <=> ','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,TIP
MOV AH,09H
INT 21H
MOV CH,4
MOV DL,0
INPUT:
MOV AH,1
INT 21H
CMP AL,30H
JA L1 ;输入的是1
ROL DL,1
OR DL,0
JMP AGAIN
L1:
ROL DL,1
OR DL,1
AGAIN:
DEC CH
JZ PRINT
JMP INPUT
PRINT:
CMP DL,0
JB EXIT
CMP DL,9
JA COMPER1
ADD DL,30H
JMP HEN
COMPER1:
ADD DL,37H
HEN:
MOV AL,DL
LEA DX,TIP1
MOV AH,09H
INT 21H
MOV DL,AL
MOV AH,02H
INT 21H
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
实现一个十六进制数向二进制数的转换
DATA SEGMENT
TIP DB 'INPUT THE NUMBER: ','$'
TIP1 DB ' <=> ','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
LEA DX,TIP
MOV AH,09H
INT 21H
INPUT:
MOV AH,1
INT 21H
CMP AL,30H
JB EXIT
CMP AL,39H
JA COMPER1
JMP CHANGE1 ;在0~9之间
COMPER1:
CMP AL,41H
JB EXIT
CMP AL,46H
JA COMPER2
JMP CHANGE2 ;在A-F之间
COMPER2:
CMP AL,61H
JB EXIT
CMP AL,66H
JA EXIT
JMP CHANGE3 ;在a~f之间
CHANGE1:
SUB AL,30H
JMP ENT
CHANGE2:
SUB AL,37H
JMP ENT
CHANGE3:
SUB AL,57H
JMP ENT
ENT:
LEA DX,TIP1
MOV AH,09H
INT 21H
MOV CH,8
MOV BL,AL
PRINT:
ROL BL,1
MOV DL,BL
AND DL,1
ADD DL,30H
MOV AH,02H
INT 21H
DEC CH
JZ EXIT
JMP PRINT
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)