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

实验结论

1.实验任务1

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

 

 

 使用add,零标志位和进位标志位都发生了改变

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

 

 

 使用inc,零标志位发生改变,进位标志位未改变

源码:

 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

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

 

 不可以,因为add指令会改变进位标志寄存器中的内容

运行截图:

程序运行前的数据段

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

 

 下面运行到程序结束前

下面是运行后的数据段

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

 

 可见加法运算正确

2.实验任务2

运行程序:

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

 

 可见程序将从键盘输入的字符输出了

line 11~18功能:

不断循环,从键盘接受字符,并将接受的字符存入数据段,然后比较接受的字符是否为'#',是则停止循环

line 20~22功能:

输出一个换行

line 24~30功能:

将总字符数赋给cx,并循环从内存中拿取,输出字符

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 
 7 code segment 
 8 start:
 9     mov ax, data 
10     mov ds, ax
11     mov si, 0
12     mov ax, len 
13     mov cl, 2
14     div cl
15     mov ah, 0
16     mov cx, ax 
17 print:
18     mov ax, [si]
19     push cx 
20     call printNumber
21     pop cx 
22     call printSpace
23     add si, 2
24     loop print 
25 
26     mov ah, 4ch 
27     int 21h
28 
29 printNumber:
30     mov bx, 0
31 s:  
32     mov dx, 0
33     mov cx, 10
34     div cx
35     push dx 
36     inc bx 
37     cmp ax, 0
38     jne s 
39 
40     mov cx, bx 
41 printStack:
42     pop dx
43     add dl, '0'
44     mov ah, 2
45     int 21h 
46     loop printStack
47     ret 
48 
49 printSpace:
50     mov ah, 2
51     mov dl, ' '
52     int 21h
53     ret 
54 code ends 
55 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 equ $ - str
 5 data ends
 6 
 7 code segment 
 8 start:
 9     mov ax, data 
10     mov ds, ax 
11     mov cx, len 
12     mov si, 0
13     call strupr
14     mov ah, 4ch
15     int 21h 
16 strupr:  
17     mov al, [si]
18     and al, 223
19     mov [si], al 
20     inc si 
21     loop strupr
22     ret 
23 code ends 
24 end start 

 

 

调用前截图:

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

 

 调用后截图:

实验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

 执行task6_1

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

 

 再执行task6_2

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

 

 可见绿色的文字出现在屏幕上

中断是硬件上实现的功能,而软中断是通过编程来实现硬件没法直接实现功能的中断方式,它可以让中断的功能更加丰富和强大

实验总结

通过这次的实验,我主要学习了和标志寄存器有关的内容,标志寄存器和指令配合,可以实现非常强大的功能,它可以记载计算机的状态或者运算历史,以便程序可以按情况实现不同的功能。

上一篇:4.第一章 计算机基础和Linux安装 -- Linux系统安装(四)


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