0%

《汇编语言》(第四版) 课程设计 1

《汇编语言(第四版)》 . 王爽著 . 清华大学出版社 . 2019

课程设计 1

注意:

  1. 选择适当的寻址方式和相关子程序的设计和应用;
  2. 程序中要显示的数据有些已经大于 65535,应该编写一个新的数据到字符串转化的子程序,完成 dword 型数据到字符串的转化;
  3. 注意子程序中除法溢出的问题,可以借鉴实验 10 中的子程序 divdw
ks_1.asm
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
assume cs:code,ds:data,ss:stack

data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上表示 21 年的 21 个字符串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示 21 年公司总收入的 21 个 dword 型数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,11430,15257,17800
;以上是表示 21 年公司雇员的 21 个 word 型数据
data ends

string segment
dw 8 dup (0)
string ends

stack segment
dw 16 dup (0)
stack ends

code segment

start: mov ax,data ;(ds)=data 段地址
mov ds,ax
mov ax,stack ;(ss)=stack 段地址
mov ss,ax
mov sp,32 ;栈顶
mov ax,0b800h ;(ex)=显示缓冲区段地址
mov es,ax

mov bx,0a0h ;从第 1 行开始(0 ~ 24 行),第 0 行看不着
mov bp,0
mov di,0 ;ds:di 代表年份字符串中的单个字符地址
mov cx,21 ;迭代 21 行

s1: push cx ;通过压栈保存外循环的剩余的循环次数
mov cx,4 ;4 位数的年份
mov si,0 ;si 代表年份中每个数字在显示时的相对位置

s2: mov al,ds:[di]
mov ah,7 ;00000111b 黑底白字
mov es:[bx+si],ax ;将字符的 ASCII 码与其属性(颜色)送入显示缓冲区
inc di
add si,2
loop s2

mov ax,ds:[di].50h ;54h + di - 4h
mov dx,ds:[di].52h ;54h + di + 2h - 4h
call dtoc
push di
mov di,20 ;di 为 show_str 的参数
call show_str
pop di

mov ax,ds:[bp].0a8h
mov dx,0
call dtoc
push di
mov di,40
call show_str
pop di

mov ax,ds:[di].50h
mov dx,ds:[di].52h
push bx
mov bx,ds:[bp].0a8h
div bx
pop bx
mov dx,0
call dtoc
push di
mov di,60
call show_str
pop di

add bx,0a0h
add bp,2
pop cx
loop s1

mov ax,4c00h
int 21h

;子程序

;名称:dtoc
;功能:将 dword 型数转变为表示十进制数的字符串,字符串以 0 为结尾符
;参数:(ax)=dword 型数据的低 16 位
; (dx)=dword 型数据的高 16 位
; ds:si 指向字符串的首地址
;返回:无

dtoc: push dx
push cx
push bx
push ax
push di
push si

mov di,0
s3: mov cx,10
call divdw
add cx,30h
push cx
inc di

mov cx,ax ;判断商是否为 0,只有当商的高位与低位皆为 0 时商为 0
or cx,dx ;将商的高位与低位按位或,若结果为 0 则商为 0
jcxz ok1
inc cx
loop s3

ok1: mov cx,di
mov si,0e0h

s4: pop ds:[si]
inc si
loop s4
mov byte ptr ds:[si],0

pop si
pop di
pop ax
pop bx
pop cx
pop dx
ret

;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为 dword 型,除数为 word 型,结果为 dword 型
;参数:(ax)=dword 型数据的低 16 位
; (dx)=dword 型数据的高 16 位
; (cx)=除数
;返回:(dx)=结果的高 16 位,(ax)=结果的低 16 位
; (cx)=余数

divdw: push bx
push ax ;高 16 位计算过程
mov ax,dx ;将被除数的高 16 位补零成 32 位放入 dx、ax 中
mov dx,0
div cx ;H/N, dx = rem(H/N), ax = int(H/N)
mov bx,ax ;将(最终结果的)商的前 16 位保存

pop ax ;低 16 位计算过程
div cx ;[rem(H/N)*65536+L]/N
mov cx,dx ;将余数放入 cx

mov dx,bx
pop bx
ret

;名称:show_str
;功能:在指定的位置,用指定的颜色(黑底白字),显示一个用 0 结束的字符串
;参数:di 为行偏置,bx 为列偏置
; ds:si 指向字符串的首地址
;返回:无

show_str: push dx
push cx
push bx
push ax
push si
push di

mov si,0e0h
mov ah,7
s5: mov al,ds:[si]

mov cl,al
mov ch,0

jcxz ok2

mov es:[bx+di],ax
add di,2
inc si
loop s5

ok2: pop di
pop si
pop ax
pop bx
pop cx
pop dx
ret

code ends

end start
用 Debug 跟踪程序运行


汇编语言实验合集

汇编语言实验合集

实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
实验 2 用机器指令和汇编指令编程
实验 3 编程、编译、连接、跟踪
实验 4 [bx] 和 loop 的使用
实验 5 编写、调试具有多个段的程序
实验 6 实践课程中的程序
实验 7 寻址方式在结构化数据访问中的应用
实验 8 分析一个奇怪的程序
实验 9 根据材料编程
实验 10 编写子程序
课程设计 1
实验 11 编写子程序
实验 12 编写 0 号中断的处理程序
实验 13 编写、应用中断例程
实验 14 访问 CMOS RAM
实验 15 安装新的 int9 中断例程
实验 16 编写包含多个功能子程序的中断例程
实验 17 编写包含多个功能子程序的中断例程
课程设计 2