西电计科微机原理实验一(详细注释版)

环境:VSCode+MASM/TASM插件(建议使用相同环境,学校机房环境有点老,可能会出一些奇怪的问题)

avatar

实验要求

  1. 打印Hello World!
  2. 打印输入的姓名
  3. 打印输入的id
  4. 将输入的字符转换成ASCII码
  5. 输入q或Q退出程序

代码

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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
stack segment
db 128 dup(0)
stack ends

data segment
msg1 db 'hello world!$' ; 定义一个字符串,表示“hello world!”
msg2 db 'please input your name:$' ; 定义一个字符串,表示提示输入名字
msg3 db 'please input your id:$' ; 定义一个字符串,表示提示输入ID
msg4 db 'please input a char:$' ; 定义一个字符串,表示提示输入一个字符
buffer db '$' ; 定义一个字符串,表示空字符串
data ends



code segment
assume cs:code,ds:data

start:
; 将数据段地址赋值给AX
mov ax,data
; 将AX的值赋值给DS
mov ds,ax
; 将AX的值赋值给ES
mov es,ax

; 显示“hello world!”字符串
lea dx, msg1
mov ah, 9
int 21h ;中断调用指令


; 回车换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h

; 提示输入名字
lea dx, msg2
mov ah, 9
int 21h


; 输入名字
lea dx, buffer
mov ah, 0Ah
mov al, 00h
int 21h
; 清空缓冲区
xor bx,bx
mov bl,buffer[1]
mov buffer[bx+2],'$'

;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h

;输出姓名
lea dx, offset [buffer+2]
mov ah, 09h
int 21h

;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h



; 提示输入ID
lea dx, msg3
mov ah,9
int 21h

; 提示输入ID的后续操作
lea dx,buffer
mov ah,0Ah
mov al,00h
int 21h

;清空缓冲区
xor bx,bx
mov bl,buffer[1]
mov buffer[bx+2],'$'


;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h

; 显示ID
lea dx, offset [buffer+2]
mov ah, 09h
int 21h




cmpq:
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
; 显示提示输入字符的字符串
lea dx,msg4
mov ah,9
int 21h

mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
;输入一个字符并回显
mov ah, 1
int 21h ;执行中断1


cmp al, 'q'
;若等于q,则跳转到ending
je ending
cmp al, 'Q'
;若等于Q,则跳转到ending
je ending
;低八位存入bl
mov bl, al
;高八位存入bh
mov bh, al
;回车+换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, bh
mov ah, 2
int 21h
mov dl, 9
mov ah, 2
and bl, 0F0h ;取bl高四位
mov cl, 4
;右移4位,高4位变为低4位
shr bl, cl
cmp bl, 9
ja alph1
;处理数字
numb1:
;转换为ascii码
add bl, '0'
mov dl, bl
mov ah, 2
int 21h ;执行2号中断,显示输出
jmp low4
alph1:
;转换为ascii码
add bl, 37h
mov dl, bl
mov ah, 2
int 21h
low4:
and bh, 0Fh ;取低四位
cmp bh, 9
ja alph2
numb2:
add bh, '0' ;加0
mov dl, bh
mov ah, 2
int 21h
jmp cmpq
alph2:
add bh, 37h ;加A
mov dl, bh
mov ah, 2
int 21h
jmp cmpq
ending:
;回车+换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
;终止程序
mov ax, 4c00h
int 21h
code ends
end start

运行结果

avatar