实验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
运行测试截图:
通过此项实现任务,你对中断、软中断实现机制的理解
答:中断需要一个中断向量表,来完成对中断程序入口地址的映射,它存放在内存地址开始处;
软中断可以调用特权操作指令。
五、实验总结
理解了标志寄存器用途和一些常见标志位的用法,练习了一些条件跳转指令,学习了中断的相关知识
posted @ 2021-12-14 11:22  Dawnmax  阅读(57)  评论(2)    收藏  举报