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

实验任务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

验证实验


此时ZF 0->1; CF 0->1

此时ZF 0->1; CF 0->0

line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?


add si, 2

add di, 2

不能换。adc指令要用到CF。而add可能改变CF。同时换了增加代码长度。

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


实验任务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,实现的功能是?

不等于#则一直读并回显


s1:        
        mov ah, 1  //键盘输入并回显
        int 21h
        mov [si], al   //送数据
        cmp al, '#'    //如果相等zf=1
        je next    //等于则转移(zf=1)
        inc si    //否则接着读下一个
        jmp s1    //循环

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

输出换行符进行换行。


next:
        mov ah, 2
        mov dl, 0ah
        int 21h

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

输出#前所有读入的字符


        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2

实验任务3

task3.asm源码

assume cs:code,ds:data

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

code segment
start:
    mov ax, data
    mov ds, ax
    mov si, offset x

    mov cx, len/2
s:  mov ax, [si]
    call printNumber
    call printSpace
    inc si
    inc si
    loop s
    mov ax, 4c00h
    int 21h

printNumber:
    push cx
    mov cx, 0

 s1:mov dx, 0
    mov bx, 10
    div bx
    push dx
    inc cx
    cmp ax, 0
    jne s1

    mov ah, 2
 s2:pop dx
    add dx, 48
    int 21h
    loop s2

    pop cx
    ret

printSpace:
    mov ah, 2
    mov dl, 20h
    int 21h
    ret
code ends
end start

运行测试截图

实验任务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 cx, len
    mov si, 0

    call strupr

    mov ax, 4c00h
    int 21h

strupr:
s:
    mov al, [si]
    cmp al, 'a'
    jb next
    cmp al, 'z'
    ja next
    sub al, 32
    mov [si], al
next:
    inc si
    loop s
    ret

code ends
end start

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


实验任务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,是输出yes,否输出no。

实验任务6

通过此项实现任务,你对中断、软中断实现机制的理解

  1. 程序通过将编写的程序送到指定位置,并设置中断向量表给出程序入口来实现自定义的软中断。
  2. 中断向量表的位置固定,找这个地方数据是为了CS和IP。
  3. 中断的过程中还需要将cs:ip入栈来跳回源程序,并且改变标志寄存器防止无限循环。
posted @ 2021-12-10 16:37  nxdxml  阅读(52)  评论(3)    收藏  举报