0%

汇编:实验13三题

1、编写安装7ch号中断例程,显示0结尾的字符串

中断例程装载程序:

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
; 8086实模式 中断例程装载程序
; 中断号 7ch
; 装载位置 0:200h

assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset handler ; ds:si指向中断例程的代码

mov ax,0
mov es,ax
mov di,200h ; es:di指向中断例程装载位置
mov cx,offset handlerend - offset handler ; 中断例程长度
cld
rep movsb ; 串传输

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

mov ax,4c00h
int 21h

handler:
; 注意!下文中断例程装载程序,只提供 handler 标号的部分,即,
; 中断处理程序开始 与 中断处理程序结束 包裹的部分

; 中断处理程序开始
; 显示0结尾的字符串
; dh 行号、dl 列号、cl 颜色、ds:si指向字符串首
push si
push es
push di
push ax
push dx
push cx

mov ax,0b800h ; 显存开始位置
mov es,ax
mov al,dh
mov dh,160
mul dh ; ax=行号*160
mov dh,0
add dx,dx ; dx=列号*2
add ax,dx
mov di,ax ; di=行号*160+列号*2

s:
mov al,[si]
cmp al,0
je ok
mov ah,cl
mov es:[di],ax
add di,2
inc si
jmp s

ok:
pop cx
pop dx
pop ax
pop di
pop es
pop si
iret
; 中断处理程序结束
handlerend:
nop

code ends
end start

调用者程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
assume cs:code
data segment
db "welcome to masm! ",0
data ends
code segment
start:
mov dh,10
mov dl,10
mov cl,2
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start

执行结果:

装载程序的编译执行

调用者程序执行结果

2、编写安装7ch号中断例程,模拟loop指令

中断例程:

1
2
3
4
5
6
7
8
9
10
11
; 中断处理程序开始
lp:
push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx ; bx是转移位移
lpret:
pop bp
iret
; 中断处理程序结束

调用者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
assume cs:code
code segment
start:
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se ; 这里的结果必须是负数,bx即转移位移
mov cx,80
s:
mov byte ptr es:[di],'!'
add di,2
int 7ch ; 如果cx≠0,转移到标号s处
se:
nop
mov ax,4c00h
int 21h
code ends
end start

执行结果:

3、补全程序,在屏幕2、4、6、8行显示英文诗

源码

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
; 在 2 4 6 8 行显示4句英文诗

assume cs:code
code segment
s1: db 'Good,better,best,','$'
s2: db 'Never let it rest,','$'
s3: db 'Till good is better,','$'
s4: db 'And better,best.','$'
s: dw offset s1,offset s2, offset s3,offset s4
row: db 2,4,6,8

start:
mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok:
mov bh,0 ; 第0页
mov dh,[si] ; 行号
mov dl,0 ; 列号
mov ah,2 ; 调10h中断例程中的显示例程
int 10h ; 调bios的10h号例程

mov dx,ds:[bx] ; ds:dx执行要显示字符串首
mov ah,9 ; 调21h中断例程的9号例程
int 21h ; 调dos的21h号中断例程

inc si
add bx,2

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

结果: