实验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 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操作不会对进位标志位CF产生影响,而add指令会对它产生影响。在add128的循环中有一个指令:adc ax,[di],该指令会被进位标志符CF影响。

  但是,8次循环,每次循环值加2,最后才产生进位,所以对结果是没有影响的。

②debug调试,观察做128位加之前和之后的变化。

 

 line31-line34的4条inc指令替换为add si,2  add di,2之后:

 

结果没有变化。

 

 

 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,实现的功能:从键盘获取单个字符,输入到data段中保存,与‘#’比较,若相等跳转到next,否则继续循环。

②line20-22,实现的功能:输出一个Ascii码为0ah的符号,即换行符。

③line24-30,实现的功能:从data段中输出刚刚保存的字符。

3.实验任务3

 task3.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     dw 32 dup(0)
10 stack ends
11 
12 code segment
13 start:
14     mov ax,data
15     mov ds,ax
16     mov cx,len/2
17     mov di,offset x
18     mov bx,10
19     mov ax,stack
20     mov ss,ax
21     mov sp,32
22 s:
23     mov ax,[di]
24     push cx
25     call printNumber
26     call printSpace
27     pop cx
28     add di,2
29     loop s
30     
31     mov ax,4c00h
32     int 21h
33 
34 printNumber:
35 
36     mov cx,0
37 s2:
38     mov dx,0    ;被除数是dx+ax,除之前要将dx清空
39     div bx        ;余数在dx,商在ax
40     push dx
41     inc cx
42     cmp ax,0
43     je s3
44     jmp s2
45 
46 s3:
47     pop dx
48     or dl,30h
49     mov ah,2
50     int 21h
51     loop s3
52 
53     ret
54 printSpace:
55     mov ah,2
56     mov dl,020h
57     int 21h
58     ret
59     
60 code ends
61 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,offset str
13     mov cx,len
14     call strupr
15     
16     mov ah, 4ch
17     int 21h
18 strupr:
19 s:
20     mov bl,[si]
21     cmp bl,'a'
22     jb next
23     cmp bl,'z'
24     ja next
25     and bl,11011111B    
26 next:
27     mov [si],bl
28     inc si
29     loop s
30 code ends
31 end start

debug调试截图

 

 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时,输出yes,其他输出no。输出的位置是在24行70列。

6.实验任务6

通过此项任务,对中断,软中断实现机制的理解:

  用int指令来实现软中断,感觉和call指令区别不大,call 后面是地址,而int 后面是一个中断类型码,引发一个n号中断的中断过程。在进入中断前,将标志寄存器,当前的CS、IP保存在栈中。执行完该中断后用iret恢复。

 

posted @ 2021-12-11 17:47  芜湖123  阅读(41)  评论(2)    收藏  举报