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

实验内容

实验任务1

在debug环境中,分别实践、观察:
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
    

    答:add指令对ZF和CF都有影响,因为从上图中可以看出ZF标志位从NZ变成了ZR(从0变成1),CF标志位从NC变成了CY(从0变成1)

② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响? 

    

    答:inc指令对ZF有影响,对CF没有影响。ZF位从NZ变成了ZR(从0变成1),CF标志位没有改变

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
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
对程序进行汇编链接,在debug中调试结果:
① line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
1 add si, 2 
2 add di, 2
    答: 可以替换成上述代码。虽然add指令对CF位有影响,但是在本题中si的范围在0000~000f,di范围在0010~001f,不产生进位。因此,无论用add还是inc指令,CF位不会发生变化,因此效果一致,可以替换。
② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。 
    答:见上图,可以看出在前16位中存放了相加前和相加后的结果。
 
实验任务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

对task2.asm进行汇编链接,运行task2.exe得出结果如下:

① 汇编指令代码line11-18,实现的功能是? 
    答:line11-18实现了读取字符并写入到data段,同时判断读取字符是否是“#”,如果是,则停止读取并转移到next开始的位置执行,如果不是,则继续读取字符。
② 汇编指令代码line20-22,实现的功能是? 
    答:line20-22实现了输出一个换行符,0ah对应十进制数10,换行符的ASCII码值为10,因此是输出一个换行符。
③ 汇编指令代码line24-30,实现的功能是?
    答:line24-30实现了将读取在data段中的字符进行输出。
 
实验任务3
task3.asm源码编写如下:
 1 assume cs:code, ds:data
 2 data segment
 3             x dw 91, 792, 8536, 65521, 2021
 4     len equ $ - x
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov si, offset x
12     mov cx, 5
13 
14 s:  push cx
15     mov cx, 0
16     mov al, ds:[si]
17     mov ah, ds:[si + 1]
18     call printNumber
19     call printSpace
20     pop cx
21     loop s
22 
23     mov ah, 4ch
24     int 21h
25 
26 printNumber:
27     mov bx, 10
28     mov dx, 0
29     div bx
30     inc cx
31     push dx
32     cmp ax, 0
33     jne printNumber
34 
35 s1: mov ah, 2
36     pop dx
37     or dl, 30h
38     int 21h
39     loop s1
40     inc si
41     inc si
42     ret
43 
44 printSpace:
45     mov ah, 2
46     mov dl, ' '
47     int 21h
48     ret
49 
50 code ends
51 end start

对源码进行汇编链接,运行后结果如下:

实验任务4
task4.asm源码编写如下:
 1 assume cs:code, ds:data
 2 data segment
 3     str db "assembly language, it's not difficult but tedious"
 4     len equ $ - str
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov si, offset str
12     mov cx, len
13 
14 s: mov al, ds:[si]
15     call strupr
16     inc si
17     loop s
18 
19     mov ah, 4ch
20     int 21h
21 
22 strupr:   
23    cmp al,  97
24     jb s1
25     cmp al, 122
26     ja s1
27     and al, 11011111B
28     jmp s1
29 
30 s1:    
31     mov ah, 2
32     mov dl, al
33     int 21h
34     ret
35 
36 
37 
38 code ends
39 end start

对源码进行汇编链接,运行后结果如下:


 
实验任务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。如果是,则在屏幕第24行,第70列打印输出yes,否则输出no

实验任务6
task6_1.asm,task6_2.asm运行结果如下:

 理解:中断过程的主要任务是用中断类型码在中断向量表中找到中断处理程序的入口地址,存入CS:IP中。通过异常向量实现对不同异常的处理。           
            中断又分为软中断和硬中断,软中断是由程序执行的中断,硬中断是由硬件执行的中断。
            在此例中,执行task6_2的int 42命令后,cpu取得中断类型码42,并将IP设为42*4,CS设为42*4+2,由于执行task6_1后,系统中CS地址的值已变为0,IP地址的              值已变为200h,所以程序将跳转到0:200h的地址处执行,打印内容。
2.自己选一个未被使用的中断码,实现一个中断例程,并调用测试(使用230中断码)
 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     ; 230 interrupt routine install code
 6     mov ax, cs
 7     mov ds, ax
 8     mov si, offset int230  ; set ds:si
 9 
10     mov ax, 0
11     mov es, ax
12     mov di, 200h        ; set es:di
13 
14     mov cx, offset int230_end - offset int230
15     cld
16     rep movsb
17 
18     ; set IVT(Interrupt Vector Table)
19     mov ax, 0
20     mov es, ax
21     mov word ptr es:[230*4], 200h
22     mov word ptr es:[230*4+2], 0
23 
24     mov ah, 4ch
25     int 21h
26 
27 int230: 
28     jmp short int230_start
29     str db "welcome to lcx201983290409!"
30     len equ $ - str
31 
32     ; display string "welcome to lcx201983290409!"
33 int230_start:
34     mov ax, cs
35     mov ds, ax
36     mov si, 202h
37 
38     mov ax, 0b800h
39     mov es, ax
40     mov di, 24*80 + 32*2
41 
42     mov cx, len
43 s:  mov al, [si]
44     mov es:[di], al
45     mov byte ptr es:[di+1], 1
46     inc si
47     add di, 2
48     loop s
49 
50     iret
51 int230_end:
52    nop
53 code ends
54 end start
 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     int 230
 6 
 7     mov ah, 4ch
 8     int 21h
 9 code ends
10 end start
使用230中断码结果如图:

 

posted @ 2021-12-10 16:27  陆晨曦  阅读(70)  评论(1)    收藏  举报