实验四 8086标志寄存器及中断
一、实验目的
- 理解标志寄存器用途,理解常用标志位CF, ZF, OF, SF, TF, IF的用途和意义。
- 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现 分支和循环的用法。
- 了解软中断指令的用法,体验和理解中断原理。
- 综合应用寻址方式和汇编指令完成简单应用编程。
二、实验结论
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;data=076Ah 10 mov ds, ax 11 mov si, offset x;x=0000h 12 mov di, offset y;y=0010h 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
-
- 回答问题
- add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
- 答:add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)有影响。
- inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
- 答:inc指令对标志寄存器中的零标志位ZF(Zero Flag) 有影响,对进位标志位CF(Carry Flag)没有影响。
line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
-
1 add si, 2 2 add di, 2
答:虽然本题中替换成如上代码,仍然可以得到正确答案。是因为si与di的范围较小,不会产生进位,不会影响进位标志位CF,因此不会影响结果。但是并不能够将上述代码替换,因为用add命令替换inc命令,可能会对CF产生影响,从而影响计算结果。
- 编译:
- 执行前:
- 执行后:
- add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
- 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
- 执行前:
- 执行后:
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
-
- 运行测试截图
- 编译链接:
- 执行:
- 编译链接:
- 回答问题
- 运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:
- 汇编指令代码line11-18,实现的功能是?
- 答:从键盘上输入字符,存放在data段中,直到遇到‘#’字符,输入结束,跳转到标号next处。此时,(si)为输入的字符串长度。
- 汇编指令代码line20-22,实现的功能是?
- 答:输出1个换行符,换行符的ASCII码值十六进制为000AH。
- 汇编指令代码line24-30,实现的功能是?
- 答:将data段中长度为(si)的字符串输出到屏幕上。
- 汇编指令代码line11-18,实现的功能是?
- 运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:
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 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset x 13 mov cx, 5 14 s1: 15 mov ax,[si] 16 mov dx,0;dx置0 17 call printNumber;调用输出函数 18 call printSpace;输出一个空格 19 inc si 20 inc si 21 loop s1 22 23 mov ah, 4ch 24 int 21h 25 printNumber: 26 push cx 27 mov cx,0;内循环次数 28 mov word ptr ds:[0ah],000ah;存放除数10 29 next: 30 div word ptr ds:[0ah] 31 push dx;余数进栈 32 inc cx;内循环+1 33 mov dx,0 34 cmp ax,0 35 je ok;相等就ok 36 jmp short next 37 ok:mov ah,2 38 s2: 39 pop dx 40 or dl,30h;输出数字字符 41 int 21h 42 loop s2 43 pop cx 44 ret 45 46 printSpace: 47 mov ah,2 48 mov dl, ' ' 49 int 21h 50 ret 51 code ends 52 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 bx,0 13 mov cx,len 14 mov si,0 15 call strupr 16 17 mov ah, 4ch 18 int 21h 19 strupr: 20 s: mov al,[si] 21 cmp al,97 22 jb s0 23 cmp al,128 24 ja s0 25 and al,11011111b;转为大写 26 mov [si],al 27 s0: 28 inc si 29 loop s 30 ret 31 code ends 32 end start
-
- 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)
- 编译链接:
![]()
![]()
- 编译链接:
5.实验任务5
- task5.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,是则在屏幕指定位置24行70列输出yes,否则,在相同位置输出no。
-
6.实验任务6
- task6_1.asm源码
-
1 assume cs:code 2 3 code segment 4 start: 5 ; 42 interrupt routine install code 6 mov ax, cs 7 mov ds, ax 8 mov si, offset int42 ; set ds:si 9 10 mov ax, 0 11 mov es, ax 12 mov di, 200h ; set es:di 13 14 mov cx, offset int42_end - offset int42 15 cld 16 rep movsb 17 18 ; set IVT(Interrupt Vector Table) 19 mov ax, 0 20 mov es, ax 21 mov word ptr es:[42*4], 200h 22 mov word ptr es:[42*4+2], 0 23 24 mov ah, 4ch 25 int 21h 26 27 int42: 28 jmp short int42_start 29 str db "welcome to 2049!" 30 len equ $ - str 31 32 ; display string "welcome to 2049!" 33 int42_start: 34 mov ax, cs 35 mov ds, ax 36 mov si, 202h 37 38 mov ax, 0b800h 39 mov es, ax 40 mov di, 24*160 + 32*2 41 42 mov cx, len 43 s: mov al, [si] 44 mov es:[di], al 45 mov byte ptr es:[di+1], 2 46 inc si 47 add di, 2 48 loop s 49 50 iret 51 int42_end: 52 nop 53 code ends 54 end start
-
- task6_2.asm
-
1 assume cs:code 2 3 code segment 4 start: 5 int 42 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
-
- 运行截图
- 编译汇编
- 运行结果
- 编译汇编
- 通过此项实现任务,我对中断、软中断实现机制的理解
-
中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。
-
CPU内部产生中断信息的可能情况有四种:(1)除法错误;(2)单步执行;(3)执行into指令;(4)执行int指令。
-
中断信息中包含有标识中断源的类型码,用于从中断向量表中查找到中断处理程序的入口地址。
-
中断过程可表示为:(1)取得中断类型码N;(2)pushf(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)(4)push CS(5)push IP(6)(IP)=(N*4),(CS)=(N*4+2)
-
- 自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。
- 源码
-
1 assume cs:code 2 3 code segment 4 start: 5 ; 44 interrupt routine install code 6 mov ax, cs 7 mov ds, ax 8 mov si, offset int44 ; set ds:si 9 10 mov ax, 0 11 mov es, ax 12 mov di, 200h ; set es:di 13 14 mov cx, offset int44_end - offset int44 15 cld 16 rep movsb 17 18 ; set IVT(Interrupt Vector Table) 19 mov ax, 0 20 mov es, ax 21 mov word ptr es:[44*4], 200h 22 mov word ptr es:[44*4+2], 0 23 24 mov ah, 4ch 25 int 21h 26 27 int44: 28 jmp short int44_start 29 str db "Hello,20192308064!" 30 len equ $ - str 31 32 int44_start: 33 mov ax, cs 34 mov ds, ax 35 mov si, 202h 36 37 mov ax, 0b800h 38 mov es, ax 39 mov di, 12*160 + 31*2 40 41 mov cx, len 42 s: mov al, [si] 43 mov es:[di], al 44 mov byte ptr es:[di+1], 11110001b 45 inc si 46 add di, 2 47 loop s 48 49 iret 50 int44_end: 51 nop 52 code ends 53 end start
-
1 assume cs:code 2 3 code segment 4 start: 5 int 44 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
-
- 运行截图
- 实现功能:44号中断码,在屏幕中央白底蓝字闪烁输出“Hello,学号”。
- 源码
三、实验总结
- 中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。
-
中断过程可表示为:(1)取得中断类型码N;(2)pushf(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)(4)push CS(5)push IP(6)(IP)=(N*4),(CS)=(N*4+2)之后CPU开始执行中断处理程序,中断处理程序的执行过程可表示为: (1)保存用到的寄存器;(2)处理中断;(3)恢复用到的寄存器;(4)用iret指令返回。
- add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)有影响。
-
inc指令对标志寄存器中的零标志位ZF(Zero Flag) 有影响,对进位标志位CF(Carry Flag)没有影响。


















浙公网安备 33010602011771号