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

一、实验目的

  • 理解标志寄存器用途,理解常用标志位CF, ZF, OF, SF, TF, IF的用途和意义。
  • 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实现 分支和循环的用法。
  • 了解软中断指令的用法,体验和理解中断原理。
  • 综合应用寻址方式和汇编指令完成简单应用编程。

二、实验结论

1.实验任务1

  • task1.asm源码
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4    x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
       5    y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
       6 data ends
       7 code segment 
       8 start:
       9     mov ax, data;data=076Ah
      10     mov ds, ax
      11     mov si, offset x;x=0000h
      12     mov di, offset y;y=0010h
      13     call add128
      14 
      15     mov ah, 4ch
      16     int 21h
      17 
      18 add128:
      19     push ax
      20     push cx
      21     push si
      22     push di
      23 
      24     sub ax, ax
      25 
      26     mov cx, 8
      27 s:  mov ax, [si]
      28     adc ax, [di]
      29     mov [si], ax
      30 
      31     inc si
      32     inc si
      33     inc di
      34     inc di
      35     loop s
      36 
      37     pop di
      38     pop si
      39     pop cx
      40     pop ax
      41     ret
      42 code ends
      43 end start
  • 回答问题
    • add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
      • 答:add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)有影响。
    • inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
      • 答:inc指令对标志寄存器中的零标志位ZF(Zero Flag) 有影响,对进位标志位CF(Carry Flag)没有影响。
    • line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
      • 1 add si, 2
        2 add di, 2

        答:虽然本题中替换成如上代码,仍然可以得到正确答案。是因为si与di的范围较小,不会产生进位,不会影响进位标志位CF,因此不会影响结果。但是并不能够将上述代码替换,因为用add命令替换inc命令,可能会对CF产生影响,从而影响计算结果。

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

2.实验任务2

  • 程序task2.asm源码
    •  1 assume cs:code, ds:data
       2 data segment
       3         str db 80 dup(?)
       4 data ends
       5 
       6 code segment
       7 start:  
       8         mov ax, data
       9         mov ds, ax
      10         mov si, 0
      11 s1:        
      12         mov ah, 1
      13         int 21h
      14         mov [si], al
      15         cmp al, '#'
      16         je next
      17         inc si
      18         jmp s1
      19 next:
      20         mov ah, 2
      21         mov dl, 0ah
      22         int 21h
      23         
      24         mov cx, si
      25         mov si, 0
      26 s2:     mov ah, 2
      27         mov dl, [si]
      28         int 21h
      29         inc si
      30         loop s2
      31 
      32         mov ah, 4ch
      33         int 21h
      34 code ends
      35 end start
  • 运行测试截图
    • 编译链接:
    • 执行:
  • 回答问题
    • 运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:
      • 汇编指令代码line11-18,实现的功能是?
        • 答:从键盘上输入字符,存放在data段中,直到遇到‘#’字符,输入结束,跳转到标号next处。此时,(si)为输入的字符串长度。
      • 汇编指令代码line20-22,实现的功能是?
        • 答:输出1个换行符,换行符的ASCII码值十六进制为000AH。
      • 汇编指令代码line24-30,实现的功能是?
        • 答:将data段中长度为(si)的字符串输出到屏幕上。

3.实验任务3

  • task3.asm源码
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     x dw 91, 792, 8536, 65521, 2021
       5     len equ $ - x
       6 data ends
       7 
       8 code segment
       9 start:
      10     mov ax, data
      11     mov ds, ax
      12     mov si, offset x
      13     mov cx, 5
      14  s1:
      15     mov ax,[si]
      16     mov dx,0;dx置0
      17     call printNumber;调用输出函数
      18     call printSpace;输出一个空格
      19     inc si
      20     inc si
      21     loop s1
      22 
      23     mov ah, 4ch
      24     int 21h
      25 printNumber: 
      26     push cx
      27     mov cx,0;内循环次数
      28     mov word ptr ds:[0ah],000ah;存放除数10
      29 next:
      30     div word ptr ds:[0ah]
      31     push dx;余数进栈
      32     inc cx;内循环+1
      33     mov dx,0
      34     cmp ax,0
      35     je ok;相等就ok
      36     jmp short next
      37 ok:mov ah,2
      38 s2:
      39     pop dx
      40     or dl,30h;输出数字字符
      41     int 21h
      42     loop s2
      43     pop cx
      44     ret
      45 
      46 printSpace:
      47     mov ah,2
      48     mov dl, ' '
      49     int 21h
      50     ret
      51 code ends
      52 end start
  • 运行测试截图
    • 编译链接:
    • 执行:  

4.实验任务4

  • task4.asm源码
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     str db "assembly language, it's not difficult but tedious"
       5     len equ $ - str
       6 data ends
       7 
       8 code segment
       9 start:
      10     mov ax,data
      11     mov ds,ax
      12     mov bx,0
      13     mov cx,len
      14     mov si,0
      15     call strupr
      16 
      17     mov ah, 4ch
      18     int 21h
      19 strupr:
      20 s:    mov al,[si]
      21     cmp al,97
      22     jb s0
      23     cmp al,128
      24     ja s0
      25     and al,11011111b;转为大写
      26     mov [si],al
      27 s0:
      28     inc si
      29     loop s
      30     ret
      31 code ends
      32 end start
  • 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)
    • 编译链接:
    • call strupr调用之前:
      call strupr调用之后:

5.实验任务5

  • task5.asm源码
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     str1 db "yes", '$'
       5     str2 db "no", '$'
       6 data ends
       7 
       8 code segment
       9 start:
      10     mov ax, data
      11     mov ds, ax
      12 
      13     mov ah, 1
      14     int 21h
      15 
      16     mov ah, 2
      17     mov bh, 0
      18     mov dh, 24
      19     mov dl, 70
      20     int 10h
      21 
      22     cmp al, '7'
      23     je s1
      24     mov ah, 9
      25     mov dx, offset str2
      26     int 21h
      27 
      28     jmp over
      29 
      30 s1: mov ah, 9
      31     mov dx, offset str1
      32     int 21h
      33 over:  
      34     mov ah, 4ch
      35     int 21h
      36 code ends
      37 end start
  • 程序运行测试截图(输入7,以及输入其他字符,运行结果截图)
  • 程序的功能是?
    • 功能:判断输入是否为7,是则在屏幕指定位置24行70列输出yes,否则,在相同位置输出no。

6.实验任务6

  • task6_1.asm源码
    •  1 assume cs:code
       2 
       3 code segment
       4 start:
       5     ; 42 interrupt routine install code
       6     mov ax, cs
       7     mov ds, ax
       8     mov si, offset int42  ; set ds:si
       9 
      10     mov ax, 0
      11     mov es, ax
      12     mov di, 200h        ; set es:di
      13 
      14     mov cx, offset int42_end - offset int42
      15     cld
      16     rep movsb
      17 
      18     ; set IVT(Interrupt Vector Table)
      19     mov ax, 0
      20     mov es, ax
      21     mov word ptr es:[42*4], 200h
      22     mov word ptr es:[42*4+2], 0
      23 
      24     mov ah, 4ch
      25     int 21h
      26 
      27 int42: 
      28     jmp short int42_start
      29     str db "welcome to 2049!"
      30     len equ $ - str
      31 
      32     ; display string "welcome to 2049!"
      33 int42_start:
      34     mov ax, cs
      35     mov ds, ax
      36     mov si, 202h
      37 
      38     mov ax, 0b800h
      39     mov es, ax
      40     mov di, 24*160 + 32*2
      41 
      42     mov cx, len
      43 s:  mov al, [si]
      44     mov es:[di], al
      45     mov byte ptr es:[di+1], 2
      46     inc si
      47     add di, 2
      48     loop s
      49 
      50     iret
      51 int42_end:
      52    nop
      53 code ends
      54 end start
  • task6_2.asm
    •  1 assume cs:code
       2 
       3 code segment
       4 start:
       5     int 42
       6 
       7     mov ah, 4ch
       8     int 21h
       9 code ends
      10 end start
  • 运行截图
    • 编译汇编
    • 运行结果
  • 通过此项实现任务,我对中断、软中断实现机制的理解
    • 中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。

    • CPU内部产生中断信息的可能情况有四种:(1)除法错误;(2)单步执行;(3)执行into指令;(4)执行int指令。

    • 中断信息中包含有标识中断源的类型码,用于从中断向量表中查找到中断处理程序的入口地址。

    • 中断过程可表示为:(1)取得中断类型码N;(2)pushf(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)(4)push CS(5)push IP(6)(IP)=(N*4),(CS)=(N*4+2)

  • 自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。
    • 源码
      •  1 assume cs:code
         2 
         3 code segment
         4 start:
         5     ; 44 interrupt routine install code
         6     mov ax, cs
         7     mov ds, ax
         8     mov si, offset int44  ; set ds:si
         9 
        10     mov ax, 0
        11     mov es, ax
        12     mov di, 200h        ; set es:di
        13 
        14     mov cx, offset int44_end - offset int44
        15     cld
        16     rep movsb
        17 
        18     ; set IVT(Interrupt Vector Table)
        19     mov ax, 0
        20     mov es, ax
        21     mov word ptr es:[44*4], 200h
        22     mov word ptr es:[44*4+2], 0
        23 
        24     mov ah, 4ch
        25     int 21h
        26 
        27 int44: 
        28     jmp short int44_start
        29     str db "Hello,20192308064!"
        30     len equ $ - str
        31 
        32 int44_start:
        33     mov ax, cs
        34     mov ds, ax
        35     mov si, 202h
        36 
        37     mov ax, 0b800h
        38     mov es, ax
        39     mov di, 12*160 + 31*2
        40 
        41     mov cx, len
        42 s:  mov al, [si]
        43     mov es:[di], al
        44     mov byte ptr es:[di+1], 11110001b
        45     inc si
        46     add di, 2
        47     loop s
        48 
        49     iret
        50 int44_end:
        51    nop
        52 code ends
        53 end start
      •  1 assume cs:code
         2 
         3 code segment
         4 start:
         5     int 44
         6 
         7     mov ah, 4ch
         8     int 21h
         9 code ends
        10 end start
    • 运行截图
    • 实现功能:44号中断码,在屏幕中央白底蓝字闪烁输出“Hello,学号”。

三、实验总结

  • 中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。
  • 中断过程可表示为:(1)取得中断类型码N;(2)pushf(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)(4)push CS(5)push IP(6)(IP)=(N*4),(CS)=(N*4+2)之后CPU开始执行中断处理程序,中断处理程序的执行过程可表示为: (1)保存用到的寄存器;(2)处理中断;(3)恢复用到的寄存器;(4)用iret指令返回。

  • add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)有影响。
  • inc指令对标志寄存器中的零标志位ZF(Zero Flag) 有影响,对进位标志位CF(Carry Flag)没有影响。

 

posted @ 2021-12-12 20:45  蓝桉66  阅读(75)  评论(2)    收藏  举报