我认为,学习一门计算机编程语言,第一件事是要掌握如何输入和输出;汇编语言也不例外。通过编制“R进制无符号数的输入/输出”程序,能练习汇编语言中的“INT 12H”中断的1、2、9、1AH号功能,ADD/SUB/MUL/DIV等算术运算指令,以及各种跳转指令的运用,这对汇编语言的快速入门有很大帮助。
“R进制无符号数的输入/输出”程序将实现这么一个功能:用户输入R进制数(R=2、8、10、16,下同)后程序自动输出相应的R进制数。下面,是该程序的输入子程序和输出子程序。
ICODE段是数的输入子程序
ICODE
1
ICODE SEGMENT
2
ASSUME CS:ICODE
3
4
B2X PROC FAR
5
MOV CX, 16
6
NEXT01: MOV AH, 1
7
INT 21H
8
CMP AL, 0DH
9
JNE L001
10
JMP EXIT01
11
L001: CMP AL, 30H
12
JNB L002
13
JMP ERR01
14
L002: CMP AL, 31H
15
JNA L003
16
JMP ERR01
17
L003: SUB AL, 30H
18
MOV DX, [RESULT] ;
19
SHL DX, 1
20
XOR AH, AH
21
ADD DX, AX
22
MOV [RESULT], DX
23
LOOP NEXT01
24
EXIT01: CALL FAR PTR SHOWXNR
25
RET
26
ERR01: CALL FAR PTR SHOWERR
27
RET
28
; ------ 以上为将输入的16位内的二进制数,并以X进制的形式输出 ------
29
B2X ENDP
30![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
O2X PROC FAR
32
MOV CX, 6
33
NEXT02: MOV AH, 1
34
INT 21H
35
CMP AL, 0DH
36
JNE L004
37
JMP EXIT02
38
L004: CMP AL, 30H
39
JNB L005
40
JMP ERR02
41
L005: CMP AL, 37H
42
JNA L006
43
JMP ERR02
44
L006: SUB AL, 30H
45
MOV DL, AL
46
XOR DH, DH
47
MOV AX, [RESULT]
48
MOV CL, 3
49
SHL AX, CL
50
ADD AX, DX
51
MOV [RESULT], AX
52
LOOP NEXT02
53
EXIT02: CALL FAR PTR SHOWXNR
54
RET
55
ERR02: CALL FAR PTR SHOWERR
56
RET
57
; ------ 以上为将输入的6位内的八进制数((0~177777)O),并以X进制的形式输出 ------
58
O2X ENDP
59![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
60
D2X PROC FAR
61
MOV CX, 5
62
NEXT03: MOV AH, 1
63
INT 21H
64
CMP AL, 0DH
65
JNE L007
66
JMP EXIT03
67
L007: CMP AL, 30H
68
JNB L008
69
JMP ERR03
70
L008: CMP AL, 39H
71
JNA L009
72
JMP ERR03
73
L009: XOR AH, AH
74
SUB AL, 30H
75
MOV DX, AX
76
MOV AX, [RESULT] ; 这里先把[RESULT]的值取出
77
MOV BH, AH ; 转移[RESULT]的高8位,这样处理使程序可适用0~65535的数,不做此处理则只能适用0~2559的数
78
MOV BL, 10
79
MUL BL ; 将[Result]的低8位乘以10
80
ADD DX, AX ; 与新输入的低位相加
81
MOV AL, BH ; 恢复高8位
82
MUL BL ; 将[Result]的高8位乘以10
83
PUSH CX ;
84
MOV CL, 8 ; 将高8位移位复原到正常位序
85
SHL AX, CL ;
86
ADD AX, DX ; 与新输入的低位相加
87
POP CX ;
88
MOV [RESULT], AX ; 将结果保存到[RESULT]
89
LOOP NEXT03
90
EXIT03: CALL FAR PTR SHOWXNR
91
RET
92
ERR03: CALL FAR PTR SHOWERR
93
RET
94
; ------ 以上为将输入的5位内的十进制数,并以X进制的形式输出 ------
95
; 思路:
96
; (0). [RESULT]初值为0
97
; (1). [RESULT]乘以10,再加上AL,最后保存到[RESULT]
98
; (2). 循环
99
D2X ENDP
100![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
101
H2X PROC FAR
102
MOV CH, 4
103
NEXT04: MOV AH, 1
104
INT 21H
105
CMP AL, 0DH
106
JE EXIT04
107
CMP AL, 30H
108
JB ERR04
109
CMP AL, 39H
110
JBE L011
111
CMP AL, 41H
112
JB ERR04
113
CMP AL, 46H
114
JBE L010
115
CMP AL, 61H
116
JB ERR04
117
CMP AL, 66H
118
JA ERR04
119
SUB AL, 20H
120
L010: SUB AL, 7H
121
JMP L011
122
L011: SUB AL, 30H
123
MOV DL, AL
124
XOR DH, DH
125
MOV AX, [RESULT]
126
MOV CL, 4
127
SHL AX, CL;
128
ADD AX, DX
129
MOV [RESULT], AX
130
DEC CH
131
JNE NEXT04
132
EXIT04: CALL FAR PTR SHOWXNR
133
RET
134
ERR04: CALL FAR PTR SHOWERR
135
RET
136
; ------ 以上为将输入的4位内的十六进制数,并以X进制的形式输出 ------
137
H2X ENDP
138
ICODE ENDS
OCODE段是数的输出子程序
; 说明:这里输出RESULT的内容;上述运算的结果保存在RESULT中。
OCODE
1
OCODE SEGMENT
2
ASSUME CS:OCODE
3
4
SHOWBNR PROC FAR
5
MOV CX, 16
6
MOV AH, 2
7
MOV BX, [RESULT]
8
NEXT11: ROL BX, 1
9
MOV DL, BL
10
AND DL, 1
11
ADD DL, 30H
12
INT 21H
13
LOOP NEXT11
14
; ------ 以上为用二进制形式输出 ------
15
RET
16
SHOWBNR ENDP
17![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
SHOWONR PROC FAR
19
MOV AH, 2
20
MOV BX, [RESULT]
21
ROL BX, 1 ;
22
MOV DL, BL
23
AND DL, 1
24
ADD DL, 30H
25
INT 21H;
26
MOV CH, 5 ;
27
MOV CL, 3 ;
28
NEXT12: ROL BX, CL
29
MOV DL, BL
30
AND DL, 7
31
ADD DL, 30H
32
INT 21H
33
DEC CH ;
34
JNE NEXT12
35
; ------ 以上为用八进制形式输出 ------
36
RET
37
SHOWONR ENDP
38![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
SHOWDNR PROC FAR ; 不能直接用AX除以BL(BL==10),
40
; 因为AX==65535时AL无法存储6553,
41
; 会出现除以0错误;故要用DX:AX
42
; 除以BX(BX==10)
43
MOV AX, [RESULT]
44
XOR BP, BP
45
NEXT131: XOR DX, DX
46
MOV BX, 10
47
DIV BX
48
PUSH DX ; 这里不能PUSH DL,否则会有警告,
49
; 而且DL也不会被进栈(于是所显示的
50
; 十进制数只有第1位是正确的)。
51
INC BP
52
CMP AX, 0
53
JNE NEXT131
54
NEXT132: POP DX
55
MOV AH, 2
56
ADD DL, 30H
57
INT 21H
58
DEC BP
59
CMP BP, 0
60
JNE NEXT132
61
; ------以上为用十进制形式输出 ------
62
RET
63
SHOWDNR ENDP
64![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
65
SHOWHNR PROC FAR
66
MOV AH, 2
67
MOV CH, 4
68
MOV BX, [RESULT]
69
MOV CL, 4
70
NEXT14: ROL BX, CL
71
MOV DL, BL
72
AND DL, 0FH
73
CMP DL, 9
74
JNA L11
75
ADD DL, 7 ; 注意是7;若是小写字母,那就是27H
76
L11: ADD DL, 30H
77
INT 21H
78
DEC CH
79
JNE NEXT14
80
; ------ 以上为用十六进制形式输出 ------
81
RET
82
SHOWHNR ENDP
83![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
84
OCODE ENDS
85![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
86
读者可以参考上述方法自行编制自己的R进制数的输入、输出程序。
或者,我已将编制好的程序源代码和相应的可执行程序打包上传至 “附件” ,读者可自行下载。源码已在MASM5.0上测试通过,暂无发现BUG;如有问题,欢迎与我联系。谢谢。
声明:本文及其源码乃本人原创,欢迎学习交流,谢绝未经同意的商业使用;本人将保留一切“知识产权”上的权利。
附:
1. R进制数的输入/输出程序
2. MASM汇编工具包
--
14:22:03,2009年2月3日