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

Posted 仲一川

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验4 8086标志寄存器及中断相关的知识,希望对你有一定的参考价值。

实验任务1

add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

 可见add指令对ZF和CF都有影响。

inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

 可见inc指令只对ZF有影响。

4task1.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会影响CF进位标志位,inc不会。

② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。

调试观察截图:

实验任务2

4task2.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

运行测试截图:

回答问题:

① 汇编指令代码line11-18,实现的功能是?

实现的功能是调用int 21h的1号子功能,从键盘上输入单个字符,如果该字符不是#,将其存入数据段偏移地址为si的位置,si自增,重复进行,直到如果字符为#时,跳转到next标号处。

② 汇编指令代码line20-22,实现的功能是?

实现的功能是调用int 21h的2号子功能,输出换行符,换行符的十六进制ASCII码值就是0AH。

③ 汇编指令代码line24-30,实现的功能是?

实现的功能是循环输出si个数据段的字符,即之前存入多少字符(除了#,#未计数),输出多少字符。

实验任务3

4task3.asm源码:

assume cs:code, ds:data

data segment
    x dw 91, 792, 8536, 65521, 2021
    len equ $- x
data ends

stack segment
    db 16 dup(0)
stack ends

code segment
start:
    mov ax, data
    mov ds, ax

    mov si,offset x
    mov cx,5
s:
    mov ax,[si]
    call printNumber
    call printSpace

    inc si
    inc si
    loop s

    mov ah, 4ch
    int 21h
    
printNumber:
    push bx
    push di
    push cx
    mov cx,0
    mov di,0
s1: mov dx,0
    mov bx,10
    div bx
    or dl,30h
    push dx
    inc di
    cmp ax,0
    jne s1
    mov cx,di
s2: pop dx
    mov ah,2
    int 21h
    loop s2

    pop cx
    pop di
    pop bx

    ret

printSpace:
    mov dl,\' \'
    int 21h
    ret


code ends
end start

运行测试截图:

 实验任务4

4task4.asm源码:

assume cs:code, ds:data
data segment
        str db "assembly language, it\'s not difficult but tedious"
        len equ $ - str
data ends

stack segment
        db 16 dup(0)
stack ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov cx, len
        mov si, offset str
        call strupr

        mov ah, 4ch
        int 21h
strupr:
s:      mov al, byte ptr ds:[si]
        cmp al, \'a\'
        jb next
        cmp al, \'z\'
        ja next

        mov ah, 2            
        and al, 11011111b      
        mov dl, al
        int 21h              
        inc si
        loop s

        cmp cx, 0
        je return

next:   mov ah, 2              
        mov dl, al
        int 21h
        inc si
        loop s
return:
        ret
code ends
end start

运行测试截图:

在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值):

 

实验任务5

4task5.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就在屏幕右下角输出yes,否则输出no。

实验任务6

4task6_1.asm源码:

assume cs:code

code segment
start:
    ; 42 interrupt routine install code
    mov ax, cs
    mov ds, ax
    mov si, offset int42  ; set ds:si

    mov ax, 0
    mov es, ax
    mov di, 200h        ; set es:di

    mov cx, offset int42_end - offset int42
    cld
    rep movsb

    ; set IVT(Interrupt Vector Table)
    mov ax, 0
    mov es, ax
    mov word ptr es:[42*4], 200h
    mov word ptr es:[42*4+2], 0

    mov ah, 4ch
    int 21h

int42: 
    jmp short int42_start
    str db "welcome to 2049!"
    len equ $ - str

    ; display string "welcome to 2049!"
int42_start:
    mov ax, cs
    mov ds, ax
    mov si, 202h

    mov ax, 0b800h
    mov es, ax
    mov di, 24*160 + 32*2

    mov cx, len
s:  mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 2
    inc si
    add di, 2
    loop s

    iret
int42_end:
   nop
code ends
end start

4task6_2.asm源码:

assume cs:code

code segment
start:
    int 42

    mov ah, 4ch
    int 21h
code ends
end start

运行测试截图:

 

 

 中断:中断是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序,在执行完中断服务程序后再返回到被中止的原有工作处的过程。中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。
软中断:软件中断是内部中断的一种,是由软件引起的非屏蔽型中断。CPU执行 INT n 指令时,立即产生一个软件中断,中断的类型由指令中的n指明。因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。软中断是通过执行中断指令产生的,是软件层面对进程的中断,汇编语言的软中断可以理解为高级语言中函数的调用。上述例子中对中断号的自定义可以灵活地执行编程需要的操作。

 

以上是关于实验4 8086标志寄存器及中断的主要内容,如果未能解决你的问题,请参考以下文章

微机原理中8086中啥是硬中断,啥是软中断,二者区别在哪

8086汇编语言学习 8086标志寄存器

8088/8086的寄存器结构(微机原理笔记)

emu8086 调用LED面板的方法

嵌入式按键中断控制 LED 及蜂鸣器实验

8086指令系统通用数据传送指令