实验4 8086标志寄存器及中断

1.实验任务1

 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
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,依据在于adc是带进位加法指令,而add会影响进位标志位,很可能使计算结果有误,inc指令则不会影响进位标志位。

做128位加之前:

实验4 8086标志寄存器及中断

做128位加之后:

实验4 8086标志寄存器及中断

 

 2.实验任务2

 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

运行测试:

实验4 8086标志寄存器及中断

(1)汇编指令代码line11-18,实现的功能是接收从键盘上输入的一串以“#”结尾的字符。

(2)汇编指令代码line20-22,实现的功能是输出换行符。

(3)汇编指令代码line24-30,实现的功能是输出此前接收的字符串且不输出结尾的“#”。

 

3.实验任务3

 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 
14     mov cx, len/2 ;从x开始的连续字数据项个数
15   s:mov ax, [si]
16     call printNumber
17     call printSpace
18     add si, 2
19     loop s
20     mov ax, 4c00h
21     int 21h
22 
23 printNumber:
24     push cx
25     mov cx, 0
26 
27  s1:mov dx, 0
28     mov bx, 10
29     div bx
30     push dx
31     inc cx
32     cmp ax, 0
33     jne s1 ;商不等于0则继续除
34  
35     mov ah, 2
36  s2:pop dx
37     or dx, 30h
38     int 21h
39     loop s2
40     
41     pop cx
42     ret
43 
44 printSpace:
45     mov ah, 2
46     mov dl, ' '
47     int 21h
48     ret
49 code ends
50 end start  

运行测试:

实验4 8086标志寄存器及中断

 

 4.实验任务4

 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     call strupr;
15     mov ax, 4c00h
16     int 21h
17 
18 strupr:
19     mov al, [si]
20     cmp al, 97
21     jb s
22     cmp al, 122
23     ja s
24     and al, 0dfh
25     mov [si], al
26   s:inc si
27     loop strupr
28     ret
29 code ends
30 end start

调试截图:

实验4 8086标志寄存器及中断

实验4 8086标志寄存器及中断

 

 5.实验任务5

实验4 8086标志寄存器及中断

实验4 8086标志寄存器及中断

 程序的功能是判断从键盘输入的字符是否为7,并且将判断结果自第24行第70列开始输出。

 

6.实验任务6

Ⅰ、中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。

Ⅱ、CPU内部产生中断信息的可能情况有四种:(1)除法错误;(2)单步执行;(3)执行into指令;(4)执行int指令。

Ⅲ、中断信息中包含有标识中断源的类型码,用于从中断向量表中查找到中断处理程序的入口地址。

Ⅳ、对于8086PC机,中断向量表指定放在内存地址0处,其中一个表项占两个字,高地址字存放中断处理程序的段地址,低地址字存放偏移地址。存储N号中断源对于的中断处理程序入口的段地址的内存单元的地址为:4N+2,偏移地址的内存单元的地址为4N。

Ⅴ、中断过程可表示为:

(1)取得中断类型码N;

(2)pushf

(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)

(4)push CS

(5)push IP

(6)(IP)=(N*4),(CS)=(N*4+2)

之后CPU开始执行中断处理程序,中断处理程序的执行过程可表示为:

(1)保存用到的寄存器;

(2)处理中断;

(3)恢复用到的寄存器;

(4)用iret指令返回。

Ⅵ、在有些情况下,CPU不会响应中断,如设置栈顶指针ss:sp时。

 

上一篇:实验4 8086标志寄存器及中断


下一篇:实验4 8086标志寄存器及中断