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

实验结论

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

    add指令,对ZFCF都有影响:

   inc指令,对ZF有影响,对CF没有影响:

 

 

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

  答:不能替换。因为inc指令不会改变标志寄存器CF的值,而add指令会改变。改变后对adc ax, [di] 有影响。

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

 

图。

 

 

 

 2.实验任务2

(1)程序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

(2)运行测试截图:

(3)回答问题:

运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题:
① 汇编指令代码line11-18,实现的功能是?
答:读入输入的字符串并存储到data段中,直到遇到#为止。
② 汇编指令代码line20-22,实现的功能是?
答:由于0aHASCII码是换行符,实现换行功能。
③ 汇编指令代码line24-30,实现的功能是?
答:输出前面输入的字符串

 3.实验任务3

(1)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
    mov bx, 10

    s0:
      inc cx
      mov dx, 0
      div bx
      push dx     
      cmp ax, 0   
      je s1
      jmp s0
    
    s1:
      pop dx    
      or dx,30H
      mov ah, 2
      int 21h
    loop s1
    pop cx
    ret

printSpace:
  mov ah, 2
  mov dl, ' '
  int 21h
  ret

code ends
end start

(2)运行测试截图:

 

4.实验任务4

(1)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
   mov ax,4c00h
   int 21h

strupr:
   s:
     mov al,[si]
     cmp al,97
     jl s1
     cmp al,122
     jg s1
     and al,11011111B
     mov [si],al
   s1:
     inc si
     loop s
     ret
code ends
end start

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

5.实验任务5

(1) 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
(2)程序运行测试截图(输入7,以及输入其他字符,运行结果截图):

 

(3)程序的功能是?
答:如果输入的字符是7”,在第2470列的位置输出“yes”;否则输出“no”。

6.实验任务6

(1)task6_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
(2)task6_2.asm源码:
assume cs:code

code segment
start:
    int 42

    mov ah, 4ch
    int 21h
code ends
end start
(3)通过此项实现任务,你对中断、软中断实现机制的理解
答:中断是指来自CPU执行指令以外的事件发生后,处理机暂停正在运行的程序,转去执行处理该事件的程序的过程。中断分为两种,硬中断和软中断,其中软中断是软件实现的中断,也就是程序运行时其他程序对它的中断。CPU收到中断信息后,堆中断信息进行处理,首先将引发终端过程。8080CPU在收到终端信息后,引发的中断过程如下:(1)(从中断信息中)获取类型码;(2)标志寄存器的值入栈;(3)设置标志寄存器的第8TF和第九位IF值为0;(4CS的内容入栈;(5IP的内容入栈;(6)从内存地址为中断类型码 * 4和中断类型码 * 4 + 2的两个字单元读取中断处理程序的入口地址IPCS
(4)运行测试截图:

 

 

 

posted @ 2021-12-14 23:13  草莓啵啵兔  阅读(46)  评论(2编辑  收藏  举报