8086 汇编是一种经典的底层语言,本文将结合代码简单介绍使用汇编语言来实现子程序的设计,以十六进制显示输出寄存器中二进制内容。

题目要求

编制一个过程把AL寄存器内的二进制数用十六进制的形式在屏幕上显示出来。

设计思路

我们知道计算机里存储的是二进制,但显示的时候是通过转换成ASCII码显示出来的,所以我们要做的就是把这些二进制数每四位一组转换成对应数字的ASCII码值并将其赋值给DL,调用21H中断将其显示输出即可。具体的转换过程可以参考代码注释部分。

参考代码

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
DATA	SEGMENT
COUNT EQU 5
ARRAY DB 12H, 34H, 24H, 86H, 47H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX, DATA
MOV DS, AX
MOV BX, OFFSET ARRAY
MOV CX, COUNT
DISPLP:
MOV AL, [BX]
CALL ALDISP
MOV AL, ',';逗号分隔,不过输出结果很让人意外
MOV AH, 02H
INT 21H
INC BX
LOOP DISPLP
EXIT:
MOV AH, 4CH
INT 21H

ALDISP PROC ;实现AL内容的显示
PUSH AX
PUSH CX
PUSH DX ;子程序使用到的寄存器压栈以保护
PUSH AX ;暂存AX,稍后转换低四位

MOV DL, AL ;转换AL高四位
MOV CL, 4 ;(CL)=4(0000HHHH)
SHR DL, CL ;(0-9)(30H-39H)(A-F)(41H-46H)
OR DL, 30H;(0000HHHH)(00110000)高四位变成3
CMP DL, 39H
JBE ALDISP1;显示数字(0-9)
ADD DL, 7 ;显示数字(A-F)
ALDISP1:
MOV AH, 02H
INT 21H
POP DX ;恢复AX保存到DX

AND DL, 0FH;转换AL低四位(HHHHLLLL)(00001111)
OR DL, 30H;(0000LLLL)(00110000)高四位变成3
CMP DL, 39H
JBE ALDISP2
ADD DL, 7
ALDISP2:
MOV AH, 02H
INT 21H
POP DX
POP CX
POP AX
RET
ALDISP ENDP

CODE ENDS
END START

运行结果

result

说明:代码中本来想用逗号分割的,结果输出的不知道是什么鬼,不过不影响功能的实现。