实验4 8086标志寄存器及中断
1. 实验任务1
task1.asm源码
1 assume cs:code, ds:data
2
3 data segment
4 x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
5 y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
6 data ends
7 code segment
8 start:
9 mov ax, data
10 mov ds, ax
11 mov si, offset x
12 mov di, offset y
13 call add128
14
15 mov ah, 4ch
16 int 21h
17
18 add128:
19 push ax
20 push cx
21 push si
22 push di
23
24 sub ax, ax ;将‘进位标志位’置为0
25
26 mov cx, 8
27 s: mov ax, [si]
28 adc ax, [di]
29 mov [si], ax
30
31 inc si
32 inc si
33 inc di
34 inc di
35 loop s
36
37 pop di
38 pop si
39 pop cx
40 pop ax
41 ret
42 code ends
43 end start
回答问题: line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2
add di, 2
不能,add可能改变进位标志位的值,从而影响 adc ax, [di] 的执行,而 inc 指令不会改变进位标志位的值。
但是本题数据特殊,add si, 2 与 add di, 2并不会产生进位,所以替换代码之后程序的执行结果并不会改变。
在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。

2. 实验任务2
task2.asm源码
1 assume cs:code, ds:data
2 data segment
3 str db 80 dup(?)
4 data ends
5
6 code segment
7 start:
8 mov ax, data
9 mov ds, ax
10 mov si, 0
11 s1:
12 mov ah, 1
13 int 21h
14 mov [si], al
15 cmp al, '#'
16 je next
17 inc si
18 jmp s1
19 next:
20 mov ah, 2
21 mov dl, 0ah
22 int 21h
23
24 mov cx, si
25 mov si, 0
26 s2: mov ah, 2
27 mov dl, [si]
28 int 21h
29 inc si
30 loop s2
31
32 mov ah, 4ch
33 int 21h
34 code ends
35 end start
运行测试截图:

回答问题:
① 汇编指令代码line11-18,实现的功能是:从键盘一个接一个的读入字符,判断是否为‘#’,若是则跳转到next处执行,若不是则计数并继续读入下一个字符
② 汇编指令代码line20-22,实现的功能是:换行
③ 汇编指令代码line24-30,实现的功能是:输出刚刚读入的一串字符,#不输出
3. 实验任务3
task3.asm源码
1 assume cs:code, ds:data
2
3 data segment
4 x dw 91, 792, 8536, 65521, 2021
5 len equ $ - x
6 data ends
7
8 code segment
9 start:
10 mov ax, data
11 mov ds, ax
12 mov si, offset x
13 mov cx, len/2
14
15 s:
16 mov ax, [si] ;数据低位(被除数)
17 mov dx, 0 ;数据高位(被除数)
18 push cx
19 call printNumber
20 call printSpace
21 pop cx
22 add si, 2
23 loop s
24
25 mov ah, 4ch
26 int 21h
27
28 printNumber:
29 mov di, 0 ;记录数据位数
30 mov bx, 10 ;除数为10
31 s1:
32 div bx
33 push dx
34 inc di
35 mov dx, 0 ;被除数要及时更新!!!!!!
36 cmp ax, 0 ;循环结束条件
37 je next
38 jmp s1
39 next:
40 mov cx, di
41 mov ah, 2
42 s2:
43 pop dx
44 or dl, 30h ;转换为10进制
45 int 21h
46 loop s2
47 ret
48
49 printSpace:
50 mov ah, 2
51 mov dl, ' '
52 int 21h
53 ret
54
55 code ends
56 end start
运行测试截图

4. 实验任务4
task4.asm源码
1 assume cs:code, ds:data
2
3 data segment
4 str db "assembly language, it's not difficult but tedious"
5 len equ $ - str
6 data ends
7
8 code segment
9 start:
10 mov ax, data
11 mov ds, ax
12 mov si, offset str
13 mov cx, len
14 s:
15 call strupr
16 inc si
17 loop s
18
19 mov ah, 4ch
20 int 21h
21
22 strupr:
23 mov al, [si]
24 cmp al, 'a'
25 jb ok ;小于则返回
26 cmp al, 'z'
27 ja ok ;大于也返回
28 and al, 11011111b
29 mov [si], al
30 ok: ret
31
32 code ends
33 end start
call strupr 调用之前,数据段的值:

call strupr 调用之后,数据段的值:
5. 实验任务5
task5.asm源码
1 assume cs:code, ds:data
2
3 data segment
4 str1 db "yes", '$'
5 str2 db "no", '$'
6 data ends
7
8 code segment
9 start:
10 mov ax, data
11 mov ds, ax
12
13 mov ah, 1
14 int 21h ; 从键盘输入字符
15
16 mov ah, 2
17 mov bh, 0
18 mov dh, 24
19 mov dl, 70
20 int 10h
21
22 cmp al, '7'
23 je s1
24 mov ah, 9
25 mov dx, offset str2
26 int 21h
27
28 jmp over
29
30 s1: mov ah, 9
31 mov dx, offset str1
32 int 21h
33 over:
34 mov ah, 4ch
35 int 21h
36 code ends
37 end start
程序运行测试截图(输入7,以及输入其他字符,运行结果截图)



程序的功能是:读入一个字符并判断是否为'7',若为'7',在第0页第24行70列输出yes并退出,否则输出no并退出。
6. 实验任务6
运行结果:

中断是指由于接收到外围硬件(相对于CPU与内存而言)的异步信号或者来自软件的同步信号而进行相应的硬件/软件处理。 显然,外围硬件发给CPU或者内存的异步信号就是硬中断信号。由软件本身发给操作系统内核的中断信号,称之为软中断。
task6_1.exe,实现将 42号中断处理程序安装到0:200开始的连续内存空间,并设置中断向量表,使得将来通过 int 42 系统可以跳转到中断处理程序。
task6_2.exe,向CPU发出中断指令,实现了42号中断处理程序。


浙公网安备 33010602011771号