0%

《汇编语言》(第四版) 实验 17

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

实验 17 编写包含多个功能子程序的中断例程

调用 int 16h 从键盘缓冲区中读取键盘的输入

BIOS 提供了 int 16h 中断例程供程序员调用。int 16h 中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为 0

int 16h 中断例程的 0 号功能进行如下的工作
1)检测键盘缓冲区中是否有数据
2)没有则继续做第一步
3)读取缓冲区第一个字单元中的键盘输入
4)将读取的扫描码送入 ah,ASCII 码送入 al
5)将已读取的键盘输入从缓冲区中删除



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
assume cs:code
code segment
start: mov ah,0
int 16h ;从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除

mov ah,1
cmp al,'r'
je red
cmp al,'g'
je green
cmp al,'b'
je blue
jmp short sret

red: shl ah,1 ;利用顺序执行的特点,不需要三个全部分开写
;红色左移两位,绿色左移一位,蓝色不移位
;red 0 000 0 100
green: shl ah,1 ;green 0 000 0 010

blue: mov bx,0b800h ;blue 0 000 0 001
mov es,bx
mov bx,1
mov cx,2000
s: and byte ptr es:[bx],11111000b
or es:[bx],ah
add bx,2
loop s

sret: mov ax,4c00h
int 21h

code ends
end start
测试程序运行

接收字符串的输入

程序的处理过程

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
charstack:  jmp short charstart

table dw charpush,charpop,charshow ;直接定址表
top dw 0 ;栈顶(栈中元素的个数)

charstart: push bx
push dx
push di
push es

cmp ah,2 ;功能码
ja sret ;非法输入处理
mov bl,ah
mov bh,0
add bx,bx ;化功能码为地址偏移
jmp word ptr table[bx] ;调用不同的子程序

charpush: mov bx,top ;top 代表的是一个内存单元
mov [si][bx],al
inc top ;每压入一个元素就令 top 自增
jmp sret

charpop: cmp top,0 ;退无可退
je sret
dec top ;每弹出一个元素就令 top 自减
mov bx,top
mov al,[si][bx]
jmp sret

charshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,ax

mov bx,0

charshows: cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' ' ;思考:此两处不加空格会如何
inc bx
add di,2
jmp charshows

sret: pop es
pop di
pop dx
pop bx
ret



补全接收字符串输入的子程序

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
getstr:     push ax

getstrs: mov ah,0
int 16h
cmp al,20h
jb nochar ;ASCII 码小于 20h,说明不是字符
;跳转到 nochar 处理 enter 与 backspace
mov ah,0
call charstack ;字符入栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs ;循环等待

nochar: cmp ah,0eh ;退格键的扫描码
je backspace
cmp ah,1ch ;Enter 键的扫描码
je enter
jmp getstrs

backspace: mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs

enter: mov al,0
mov ah,0
call charstack ;0 入栈
mov ah,2
call charstack ;显示栈中的字符
pop ax
ret

测试程序(省略子程序)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
assume cs:code

data segment
dw 128 dup (0)
data ends

code segment

start: mov dh,12
mov dl,0
mov ax,data
mov ds,ax
mov si,0
call getstr

mov ax,4c00h
int 21h

...

code ends
end start
测试程序运行

应用 int 13h 中断例程对磁盘进行读写

读取 0 面 0 道 1 扇区的内容到 0:200 的程序如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
mov ax,0
mov es,ax
mov bx,200h

mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0

mov ah,2
int 13h

将 0:200 中的内容写入 0 面 0 道 1 扇区。

1
2
3
4
5
6
7
8
9
10
11
12
mov ax,0
mov es,ax
mov bx,200h

mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0

mov ah,3
int 13h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov bx,0

mov al,8
mov ch,0
mov cl,1
mov dl,0
mov dh,0

mov ah,3
int 13h

mov ax,4c00h
int 21h
code ends
end start

实验任务

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
assume cs:code

code segment

start: mov ax,cs
mov ds,ax
mov si,offset int7c ;设置 ds:si 指向源地址
mov ax,0
mov es,ax
mov di,0200h ;设置 es:di 指向目的地址

mov cx,offset int7cend-offset int7c ;设置 cx 为传输长度

cld ;设置传输方向为正
rep movsb ;串传送操作

mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0 ;设置中断向量表
sti

mov ax,4c00h
int 21h

int7c: push ax
push cx
push dx

push ax
mov ax,dx
mov dx,0
mov cx,1440
div cx

;面号
push ax

mov ax,dx
mov dx,0
mov cx,18
div cx

;磁道号
push ax

;扇区号
inc dx
push dx

pop ax
mov cl,al
pop ax
mov ch,al
pop ax
mov dh,al
mov dl,0
pop ax
add ah,2 ;设置读写功能
mov al,1 ;读写一个扇区
int 13h

in7cret: pop dx
pop cx
pop ax
iret

int7cend: nop

code ends

end start

测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
assume cs:code
code segment
start:mov ah,0
mov dx,1439
mov bx,0b800h
mov es,bx
mov bx,0

int 7ch

mov ax,4c00h
int 21h
code ends
end start

汇编语言实验合集

汇编语言实验合集

实验 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