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

1. 实验任务1
  • task4_1.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

 

  • 回答问题

  line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?

1 add si, 2
2 add di, 2

  答:不可以,因为add有可能会改变进位标志位,在执行adc指令的时候结果就会出错。

  • 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截
    图。

  在做相加之前的数据段截图

 

   在做相加之后的数据段截图

 

 

 

 

2. 实验任务2
  • 程序task4_2.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

 

  • 运行测试截图

  • 回答问题
  运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结
  果。结合运行结果,理解代码并回答问题:
  ① 汇编指令代码line11-18,实现的功能是?
  答:调用int 21h的1号子功能,从键盘上输入单个字符,只要该字符不是#,将其ASCII码存入al。
  ② 汇编指令代码line20-22,实现的功能是?
  答:调用int 21h的2号子功能,输出al存放ASCII对应的字符,即进行换行。
  ③ 汇编指令代码line24-30,实现的功能是?
  答:循环调用int 21h的2号子功能,输出al存放ASCII对应的字符,即将刚刚输入[si]中的字符依次输出。
3. 实验任务3
  • task4_3.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 stack segment
 9     db 16 dup(0)
10 stack ends
11 
12 code segment
13 start:  
14     mov ax, data
15     mov ds, ax
16 
17     mov si,offset x
18     mov cx,5
19    
20 s:
21     mov ax,[si]
22     call printNumber
23     call printSpace
24 
25     inc si
26     inc si
27     loop s
28 
29     mov ah, 4ch
30     int 21h
31 
32 printNumber: 
33     push bx
34     push di
35     push cx
36     mov cx,0
37     mov di,0
38 s1:mov dx,0
39     mov bx,10
40     div bx
41     or dl,30h
42     push dx
43     inc di
44     cmp ax,0
45     jne s1
46     mov cx,di
47 s2:pop dx
48     mov ah,2
49     int 21h
50     loop s2
51 
52     pop cx
53     pop di
54     pop bx
55 
56     ret
57 
58 printSpace: 
59     mov dl,' '
60     int 21h
61     ret
62 
63     
64 code ends
65 end start

 

  • 运行测试截图

 

 

4. 实验任务4
  • task4_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 
13     mov si,offset str
14     mov cx,len
15    
16 s:
17     call strupr
18     inc si
19     loop s
20 
21     mov ah, 4ch
22     int 21h
23 
24 strupr: 
25     mov al,[si]
26     cmp al,'a'
27     jb ok
28     cmp al,'z'
29     ja ok
30     and byte ptr ds:[si],11011111b
31 ok:ret
32 
33     
34 code ends
35 end start

 

  • 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

 

 

5. 实验任务5
  • task4_5.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时在屏幕右下角输出yes,否则输出no

6. 实验任务6
  •  通过此项实现任务,你对中断、软中断实现机制的理解
 

 

 当产生中断信息时,CPU用8位的中断类型码通过中断向量包找到相应的中断处理程序入口地址。运用movsb指令,将代码送入0:200处,在写入中断向量表项中,使这段代码成为中断处理程序。当CPU收到对应的中断信息时,CPU就会帮我们把PC指针定位到异常向量表中某一个位置,这里实现地址的映射,指向什么函数入口,需要我们自己来实现。task6_1实现了向量表的设置,安装中断代码,task6_2则向CPU发出中断指令,于是实现了42号中断处理程序。


 

 


 

 


 

 

posted @ 2021-12-10 11:31  『子休』  阅读(76)  评论(1)    收藏  举报