实验4 8086标志寄存器及中断
一、实验目的
1. 理解标志寄存器用途,理解常用标志位CF, ZF, OF, SF, TF, IF的用途和意义。
2. 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现
分支和循环的用法
3. 了解软中断指令的用法,体验和理解中断原理
4. 综合应用寻址方式和汇编指令完成简单应用编程
二、实验准备
1.复习教材「第10章 call和ret指令」、「第11章 标志寄存器」
2.学习教材「第12章 内中断 」、「第13章 int指令」
三、实验内容
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
回答问题
line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2 add di, 2
答:不能,因为add指令会改变进位标志寄存器的值
在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
加之前:

加之后:
2. 实验任务2
task2.asm源码:
assume cs:code, ds:data data segment str db 80 dup(?) data ends code segment start: mov ax, data mov ds, ax mov si, 0 s1: mov ah, 1 int 21h mov [si], al cmp al, '#' je next inc si jmp s1 next: mov ah, 2 mov dl, 0ah int 21h mov cx, si mov si, 0 s2: mov ah, 2 mov dl, [si] int 21h inc si loop s2 mov ah, 4ch int 21h code ends end start
运行测试截图:
回答问题
运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结
果。结合运行结果,理解代码并回答问题:
① 汇编指令代码line11-18,实现的功能是?
接受输入#前输入的字符
② 汇编指令代码line20-22,实现的功能是?
输出一个换行符
③ 汇编指令代码line24-30,实现的功能是?
打印接收到的不包括#的字符串
3. 实验任务3
task3.asm源码:
assume cs:code, ds:data data segment x dw 91, 792, 8536, 65521, 2021 len equ $ - x data ends stack segment dw 8 dup(?) stack ends code segment start:mov ax, data mov ds, ax mov cx, 5 mov si, offset x print:mov ax, ds:[si] call printNumber call printSpace inc si inc si loop print mov ah, 4ch int 21h printNumber: mov bl, 10 mov dx, 0 mov di, 0 push cx s1: div bx push dx inc di mov dx, 0 cmp ax, 0 je s2 jmp s1 s2: mov ah, 2 mov cx, di s3: pop dx or dl, 30h int 21h loop s3 pop cx ret printSpace: mov ah, 2 mov dl, ' ' int 21h ret code ends end start
运行测试截图:
4. 实验任务4
task4.asm:
assume cs:code, ds:data data segment str db "assembly language, it's not difficult but tedious" len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov si, offset str mov cx, len call strupr s: mov ah, 4ch int 21h strupr: s0: cmp byte ptr [si],'a' jb s1 cmp byte ptr [si],'z' ja s1 sub byte ptr [si],32 s1: inc si loop s0 ret code ends end start
调用前截图:

调用后截图:

5. 实验任务5
task5.asm源码:
assume cs:code, ds:data data segment str1 db "yes", '$' str2 db "no", '$' data ends code segment start: mov ax, data mov ds, ax mov ah, 1 int 21h mov ah, 2 mov bh, 0 mov dh, 24 mov dl, 70 int 10h cmp al, '7' je s1 mov ah, 9 mov dx, offset str2 int 21h jmp over s1: mov ah, 9 mov dx, offset str1 int 21h over: mov ah, 4ch int 21h code ends end start
运行测试截图(输入7和输入其它字符):

程序的功能是判断输入的字符是否为7,是就在屏幕的24行70列出开始打印yes,不是就在相同位置开始打印no
6. 实验任务6
运行测试截图:
通过此项实现任务,你对中断、软中断实现机制的理解
答:中断需要一个中断向量表,来完成对中断程序入口地址的映射,它存放在内存地址开始处;
软中断可以调用特权操作指令。
五、实验总结
理解了标志寄存器用途和一些常见标志位的用法,练习了一些条件跳转指令,学习了中断的相关知识
浙公网安备 33010602011771号