实验4 8086标志寄存器及中断
一、实验目的
1. 理解标志寄存器用途,理解常用标志位CF, ZF, OF, SF, TF, IF的用途和意义。
2. 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现
分支和循环的用法
3. 了解软中断指令的用法,体验和理解中断原理
4. 综合应用寻址方式和汇编指令完成简单应用编程
二、实验结论
1.实验任务1
①task1.asm码源
assume cs:code, ds:data data segment x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h data ends code segment start: mov ax, data mov ds, ax mov si, offset x mov di, offset y call add128 mov ah, 4ch int 21h add128: push ax push cx push si push di sub ax, ax mov cx, 8 s: mov ax, [si] adc ax, [di] mov [si], ax inc si inc si inc di inc di loop s pop di pop si pop cx pop ax ret code ends end start
②回他问题
验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。
在debug环境中,分别实践、观察:
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。
① line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2 add di, 2
不能,首先add与si并不完全相同,如上面验证性实验所示,add进位时会改变进位标志位,inc不会改变,而本程序实现的是两位128位数相加,会涉及进位标志位,而如果改成add,将可能影响整个程序的结果。
② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。
前:
后
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
测试截图
汇编指令代码line11-18,实现的功能:将输入的每个字符存在[si]中,并且判断字符是否为'#',是#则跳转next中,不是则继续执行。
汇编指令代码line20-22,实现的功能是:调用int 21h 的二号子功能,并向dl中存放换行符的ASCII码,在屏幕上输出换行符,为接下来重复输出这个字符串做准备
汇编指令代码line24-30,实现的功能是:调用int 21的二号子功能,将[si]中存放的字符输出。
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',是则在第24行70列输出"yes",不是输出"no"
3.实验任务3
1 assume ds:data, cs:code, ss:stack 2 3 ;数据段 4 data segment 5 x dw 91, 792, 8536, 65521, 2021 6 len equ $ - x 7 data ends 8 9 ;栈段 10 stack segment 11 dw 8 dup(0) 12 stack ends 13 14 ;代码段 15 code segment 16 start: 17 mov ax, data 18 mov ds, ax 19 mov ax, stack 20 mov ss, ax 21 mov sp, 16 22 mov cx, len/2 ; 23 mov si, offset x 24 25 print: 26 mov ax, [si] 27 mov dx, 0 28 29 push cx 30 call printNumber 31 call printSpace 32 33 pop cx 34 inc si 35 inc si 36 loop print 37 38 mov ah, 4ch 39 int 21h 40 41 printNumber: 42 mov cx, 0 43 s1: 44 mov dx, 0 45 mov bx, 10 46 div bx 47 push dx 48 inc cx 49 cmp ax, 0 50 jne s1 51 52 p: 53 pop dx 54 or dl, 30h 55 mov ah, 2 56 int 21h 57 loop p 58 59 60 ret 61 62 printSpace: 63 mov dl, ' ' 64 mov ah, 2 65 int 21h 66 ret 67 68 code ends 69 end start
4.实验任务4
1 assume cs:code, ss:stack, ds:data 2 3 ;数据段 4 data segment 5 str db "assembly language, it's not difficult but tedious" 6 len equ $ - str 7 data ends 8 9 ;栈段 10 stack segment 11 db 8 dup(0) 12 stack ends 13 14 ;代码段 15 code segment 16 start: 17 mov ax, data 18 mov ds, ax 19 mov ax, stack 20 mov ss, ax 21 mov sp, 8 22 mov si, 0 23 mov cx, len 24 25 push cx 26 push si 27 call strupr 28 pop si 29 pop cx 30 31 push cx 32 push si 33 call printStr 34 pop si 35 pop cx 36 37 mov ax, 4c00h 38 int 21h 39 40 ;子程序strupr 41 strupr: 42 43 trans: 44 mov al, ds:[si]; 45 cmp al, 'a' 46 jl next 47 cmp al, 'z' 48 jg next 49 and al, 0dfh 50 mov ds:[si], al 51 next: 52 inc si 53 loop trans 54 55 ret 56 57 ;子程序printStr 58 printStr: 59 print: 60 mov ah, 2 61 mov dl, ds:[si] 62 int 21h 63 inc si 64 loop print 65 ret 66 67 code ends 68 end start
6.实验任务6
通过此项实现任务,你对中断、软中断实现机制的理解:
(1)中断的原因:CPU要优先处理一些“特殊事件”或者程序的“异常”
(2)中断的过程:产生中断信息;收到中断信息;执行中断处理程序;恢复原状态
(3)中断过程:取得中断类型码N;pushf;TF=0,IF=0 ;push CS;push IP;(IP)=(N*4),(CS)=(N*4+2)
三、实验结论
对第十二章和第十三章,尤其是中断部分有很多还没有弄明白