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

实验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
    
  • 回答问题 line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?

    add si, 2
    add di, 2
    

    不能替换,add指令在运行时会影响进位寄存器,在两串数字相加时有可能会影响结果

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

    image-20211210112815366

实验任务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
    
  • 运行测试截图

    image-20211217083549486

  • 回答问题

    运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:

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

      读取输入字符存储在ds:[si]中,遇到"#"符号就跳转到"next"处执行

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

      换行输出

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

      输出除“#”以外的所有字符

实验任务3

  • task3.asm源码

    assume cs:code,ds:data
    data segment
        x dw 91,792,8536,65521,2021
    data ends
    
    stack segment
        db 16 dup(0)
    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 dl,0
    s:
        mov dx,0
        mov bx,10
        div bx
        or dl,30h
        push bx
        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
    
  • 运行测试截图

    image-20211217084358150

实验任务4

  • task4.asm源码

    assume ds:data, cs:code
    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
    
    s1: call strupr
        inc si
        loop s1
    
    
        mov ah, 4ch
        int 21h
    
    strupr:
        cmp byte ptr ds:[si], 96
        jna s2
        sub byte ptr ds:[si], 32 
    s2:
        mov dx, ds:[si]
        mov ah, 2
        int 21h
        ret
    
    code ends
    end start
    
  • 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

    image-20211217085051344

    image-20211217085145052

实验任务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,以及输入其他字符,运行结果截图)

    image-20211217085455008

  • 程序的功能是?

    判断输入字符是否为7,是则输出yes,不是输出no

实验任务6

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

    • 中断分为硬中断和软中断,硬中断是指硬件产生的中断,软中断是指软件产生的中断

    • 使用中断类型码在中断向量表中找到中断处理程序的入口,使用它设置CS和IP,使CPU执行中断处理程序。CPU 在收到中断信息后对中断信息进行处理,引发中断过程。硬件在完成中断过程之后,CS:IP指向中断处理程序的入口,CPU执行中断处理程序。

posted @ 2021-12-17 09:18  韩金玲  阅读(71)  评论(2)    收藏  举报