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

1. 实验任务1

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

ZF:NZ->ZR

CF:NC->CY

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

ZF:NZ->ZR

CF没有变化

源码:

 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

答:本题中数据没有进位问题可以替换,实际中不一定可以替换。

inc指令:

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

 add指令:

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

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

加之前:

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

 加之后:

实验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标志寄存器及中断

① 汇编指令代码line11-18,实现的功能是?

:获取从键盘输入的字符串,并判断是不是#,是的话跳转到next段。

② 汇编指令代码line20-22,实现的功能是?

:有0ah和代码段功能知,是输出一个换行符。

③ 汇编指令代码line24-30,实现的功能是?

:输出数据段中保存的字符串。

 

3. 实验任务3

源码:

 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 stack segment
 7     db 64 dup(0)
 8     top equ $+1
 9 stack ends
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov ax,stack
15     mov ss,ax
16     mov sp,top
17 
18     mov cx,len/2
19     mov bx,0
20 s1:  
21     mov ax,ds:[bx]
22     push bx
23     push cx
24     call printNumber
25     call printSpace
26     pop cx
27     pop bx
28     add bx,2
29     loop s1
30 
31     mov ah,4ch
32     int 21h
33 
34 printNumber:
35     ;ax dx
36     ;ax 被除数,直到
37     ;cx计有多少位,然后循环出栈输出
38     mov bx,10
39     mov cx,0
40 s2:
41     mov dx,0
42     div bx
43     ;ax 商
44     ;dx 余数
45     push dx
46     inc cx
47     cmp ax,0
48     jne s2
49 
50 s3:
51     mov ah,2
52     pop dx
53     or dl,30h
54     int 21h
55     loop s3
56     ret
57 
58 printSpace:
59     mov ah,2
60     mov dl,20h
61     int 21h
62     ret
63 
64 code ends
65 end start

结果

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

 

4. 实验任务4

 源码:

 1 assume cs:code,ds:data
 2 data segment
 3     str db "assembly language, it's not difficult but tedious"
 4     len = ($ - str)
 5 data ends
 6 stack segment
 7     db 128 dup(0)
 8     top equ $ + 1
 9 stack ends
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov ax,stack
15     mov ss,ax
16     mov sp,top
17 
18     mov si,0
19     mov cx,len
20     call strupr
21     mov ah,4ch
22     int 21h
23 strupr:
24 ;0100 0001 A
25 ;0110 0001 a
26 s:
27     cmp byte ptr ds:[si],61h
28     jb s1;无符号小于则跳转
29     cmp byte ptr ds:[si],7ah
30     ja s1;无符号大于则跳转
31     mov dl,ds:[si]
32     and dl,11011111B
33     mov ds:[si],dl
34 s1: 
35     inc si
36     loop s
37     ret
38 code ends
39 end start

调试截图

 call strupr 之前:

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

  call strupr 之后:

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

 

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

测试截图

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

 程序的功能是?

:判断是不是字符7,是则屏幕右下角输出yes,不是则在屏幕右下角输出no

 

6. 实验任务6

运行结果

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

对中断、软中断实现机制的理解

  中断:中断是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止的原有工作处的过程。中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。
  软中断:软件中断是内部中断的一种,是由软件引起的非屏蔽型中断。CPU执行 INT n 指令时,立即产生一个软件中断,中断的类型由指令中的n指明。因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。

 

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


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