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

一、实验目的

1. 理解标志寄存器用途,理解常用标志位CF, ZF, OF, SF, TF, IF的用途和意义。
2. 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现
分支和循环的用法
3. 了解软中断指令的用法,体验和理解中断原理
4. 综合应用寻址方式和汇编指令完成简单应用编程
 
二、实验结论
 1.实验任务1
①task1.asm码源
assume cs:code, ds:data

data segment
   x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
   y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
code segment 
start:
    mov ax, data
    mov ds, ax
    mov si, offset x
    mov di, offset y
    call add128

    mov ah, 4ch
    int 21h

add128:
    push ax
    push cx
    push si
    push di

    sub ax, ax

    mov cx, 8
s:  mov ax, [si]
    adc ax, [di]
    mov [si], ax

    inc si
    inc si
    inc di
    inc di
    loop s

    pop di
    pop si
    pop cx
    pop ax
    ret
code ends
end start

②回他问题

验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。
在debug环境中,分别实践、观察:
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
 
对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。
① line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2 
add di, 2

不能,首先add与si并不完全相同,如上面验证性实验所示,add进位时会改变进位标志位,inc不会改变,而本程序实现的是两位128位数相加,会涉及进位标志位,而如果改成add,将可能影响整个程序的结果。

② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。
前:

 

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

测试截图

汇编指令代码line11-18,实现的功能:将输入的每个字符存在[si]中,并且判断字符是否为'#',是#则跳转next中,不是则继续执行。
汇编指令代码line20-22,实现的功能是:调用int 21h 的二号子功能,并向dl中存放换行符的ASCII码,在屏幕上输出换行符,为接下来重复输出这个字符串做准备
汇编指令代码line24-30,实现的功能是:调用int 21的二号子功能,将[si]中存放的字符输出。
 
5.实验任务5
 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',是则在第24行70列输出"yes",不是输出"no"

 

3.实验任务3

 1 assume ds:data, cs:code, ss:stack
 2 
 3 ;数据段
 4 data segment
 5   x dw 91, 792, 8536, 65521, 2021
 6   len equ $ - x
 7 data ends
 8 
 9 ;栈段
10 stack segment
11   dw 8 dup(0)
12 stack ends
13 
14 ;代码段
15 code segment
16 start:
17     mov ax, data
18     mov ds, ax
19     mov ax, stack
20     mov ss, ax
21     mov sp, 16
22     mov cx, len/2 ;
23     mov si,  offset x
24 
25 print:
26       mov ax, [si]
27       mov dx, 0
28 
29       push cx
30       call printNumber
31       call printSpace
32 
33       pop cx
34       inc si
35       inc si
36       loop print
37 
38     mov ah, 4ch
39     int 21h
40 
41 printNumber:
42       mov cx, 0
43     s1:
44       mov dx, 0
45       mov bx, 10
46       div bx
47       push dx
48       inc cx
49       cmp ax, 0
50       jne s1
51 
52     p:
53       pop dx
54       or dl, 30h
55       mov ah, 2
56       int 21h
57       loop p
58 
59 
60 ret
61 
62 printSpace:
63     mov dl, ' '
64     mov ah, 2
65     int 21h
66 ret
67 
68 code ends
69 end start

 

4.实验任务4

 1 assume cs:code, ss:stack, ds:data
 2 
 3 ;数据段
 4 data segment
 5     str db "assembly language, it's not difficult but tedious"
 6     len equ $ - str
 7 data ends
 8 
 9 ;栈段
10 stack segment
11     db 8 dup(0)
12 stack ends
13 
14 ;代码段
15 code segment
16 start:
17     mov ax, data
18     mov ds, ax
19     mov ax, stack
20     mov ss, ax
21     mov sp, 8
22     mov si, 0
23     mov cx, len
24 
25     push cx
26     push si
27     call strupr
28     pop si
29     pop cx
30 
31     push cx
32     push si
33     call printStr
34     pop si
35     pop cx
36 
37     mov ax, 4c00h
38     int 21h
39 
40 ;子程序strupr
41 strupr:
42 
43     trans:
44         mov al, ds:[si];
45         cmp al, 'a'
46         jl next
47         cmp al, 'z'
48         jg next
49         and al, 0dfh
50         mov ds:[si], al
51         next:
52         inc si
53         loop trans
54 
55 ret
56 
57 ;子程序printStr
58 printStr:
59     print:
60         mov ah, 2
61         mov dl, ds:[si]
62         int 21h
63         inc si
64         loop print
65 ret
66 
67 code ends
68 end start

 

6.实验任务6

通过此项实现任务,你对中断、软中断实现机制的理解:
(1)中断的原因:CPU要优先处理一些“特殊事件”或者程序的“异常”
(2)中断的过程:产生中断信息;收到中断信息;执行中断处理程序;恢复原状态
(3)中断过程:取得中断类型码N;pushf;TF=0,IF=0 ;push CS;push IP;(IP)=(N*4),(CS)=(N*4+2)

 

三、实验结论

对第十二章和第十三章,尤其是中断部分有很多还没有弄明白


 

 

 
posted @ 2021-12-14 14:17  ketan  阅读(125)  评论(2编辑  收藏  举报