二进制转十六进制

本文最后更新于:2022年5月29日 上午

使用汇编语言,实现输入二进制,转换成十六进制输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
DATA SEGMENT

NUM DB 20,?,20 DUP(?);定义缓存区

RESULTS DB 0,0,0,0,'$';存放输出结果

CRLF DB 0DH,0AH,'$';回车空格

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET NUM

MOV AH,0AH

INT 21H

LEA SI,NUM;SI指向缓冲区

MOV CL,[SI+1];CL<-实际键入字节数

XOR BX,BX;BX寄存器各位置0

B1:

MOV AX,[SI+2]

CMP AL,'0'

JE S0

CMP AL,'1'

JE S1

S0:

MOV AX,0

ROL BX,1;算术左移1位

ADD BX,AX;BX存放输入的值

INC SI;指向下一字节

LOOP B1;CX=0?

S1:

MOV AX,1

ROL BX,1

ADD BX,AX

INC SI

LOOP B1

LEA DX,CRLF;输出回车空格

MOV AH,09H

INT 21H

MOV DI,OFFSET RESULTS

MOV CH,4;大循环次数



ROTATE: ;转换后产生一个十六进制数

MOV CL,4;小循环次数(左移4次)

ROL BX,CL;对BX左移4次

MOV AL,BL;AL<-BL

AND AL,0FH;截得一个十六进制数

ADD AL,30H;加30H,转换成ASCII码

CMP AL,3AH;与‘9+1’比较,>9?

JL C1;小于等于9,转显示

ADD AL,07H;否则加07H,将数字0AH~0FH转换成ASCII码

C1:

MOV [DI],AL

INC DI

DEC CH;循环4次

JNZ ROTATE;CX=0?,没有就继续转大循环

MOV DI,OFFSET RESULTS

D1:

CMP BYTE PTR[DI],'0';不输出前面的0

JNZ DISPLAY

INC DI

LOOP D1

DISPLAY:

MOV DX,DI

MOV AH,09H

INT 21H

EXIT:

MOV AH,4CH

INT 21H

CODE ENDS​

END START

二进制转十六进制
https://kevinloongc.github.io/posts/25377.html
作者
Kevin Loongc
发布于
2017年11月9日
许可协议