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

实验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
25     
26     mov cx, 8
27 
28 s:  mov ax, [si]
29     adc ax, [di]
30     mov [si], ax
31 
32     inc si
33     inc si
34     inc di
35     inc di
36     loop s
37 
38     pop di
39     pop si
40     pop cx
41     pop ax
42     ret
43 code ends
44 end start
  • line31~line34的4条inc指令不能替换成如下代码:
1 add si, 2
2 add di, 2

   原因:因为add指令对于标志寄存器中的零标志位ZF有影响,对进位标志位CF也有影响,而inc指令仅仅对ZF零标志位有影响,对进位标志位CF无影响。在此次实验中我们使用了adc指令,这是考虑到低位运算中的进位对高位运算的影响,如果使用add指令可能会对之前运算的进位标志位产生影响,进而使得最终的运算结果出错,所以这里的inc指令不能替换成add指令。

  • 调试截图

 

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,实现的功能是读取一个用户输入的字符,将字符的ASCII值存放到数据段中,并判断用户输入的字符是否是‘#’,如果是则跳转到标号next处,否则跳转回标号s1处,继续读入字符。

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

   ③汇编指令代码line24-30,实现的功能是循环si次,将之前存放到数据段中的字符输出到屏幕上。

 

3.实验任务3

  • task3.asm源码
 1 assume ds:data, cs:code, ss:stack
 2 
 3 data segment
 4     x dw 91, 792, 8536, 65535, 2021, 0
 5     len equ $ - x
 6 data ends
 7 
 8 stack segment
 9     dw 8 dup(?)
10 stack ends
11 
12 code segment
13 start:
14     mov ax, data
15     mov ds, ax
16     mov ax, stack
17     mov ss, ax
18     mov sp, 16
19 
20     mov cx, len/2
21 s1: mov ax, word ptr ds:[di]                                  
22     call printNumber   
23     call printSpace    
24     add di, 2
25     loop s1
26     
27     mov ah, 4ch
28     int 21h
29 
30 printNumber:
31     mov bx, 0
32     
33 s2: mov bp, 10      
34     mov dx, 0      
35     div bp          
36     push dx         
37     inc bx         
38     mov cx, ax      
39     inc cx       
40     loop s2
41    
42     mov cx, bx         
43     
44 s3: pop dx          
45     add dl, 30h     
46     mov ah, 2     
47     int 21h
48     loop s3 
49 
50     ret
51 
52 printSpace:
53     mov ah, 2
54     mov dl, 20h
55     int 21h
56     ret
57 
58 code ends
59 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, 0
13     mov cx, len
14     call strupt
15 
16     mov si, 0
17     mov cx, len
18     mov ah, 2
19 
20 s:  mov dl, [si]
21     int 21h
22     inc si
23     loop s
24 
25     mov ax, 4c00h
26     int 21h
27 
28 strupt:
29 s0: cmp byte ptr [si], 'a'
30     jb s1
31     cmp byte ptr [si], 'z'
32     ja s1
33     sub byte ptr[si], 20h
34 s1: inc si
35     loop s0
36     ret
37 
38 code ends
39 end start
  • 在debug中调试截图(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则在显存中第24行,第70列处输出yes,否则输出no。

 

6.实验任务6

  • 运行截图

   当cpu内部有某些事件发生时,会产生中断信息,比如执行int指令。cpu在收到中断信息后,引发中断过程,然后就会执行该中断信息对应的处理程序。中断向量表在内存中保存,其中存放256个中断源对应的中断处理程序入口。因此,根据中断码,就可以通过中断向量表得到对应处理程序的入口,从而执行中断处理程序。

 

posted @ 2021-12-14 14:09  濯源  阅读(20)  评论(2)    收藏  举报