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

实验结论

一、实验任务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
10     mov ds, ax
11     mov si, offset x
12     mov di, offset y
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
  • 回答问题

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

1 add si,2
2 add di,2

inc的结果:

add的结果: 

 

由于所给代码中的数据没有产生进位,因此显示结果相同。

接下来,修改数据段,如下所示:

data segment
   x dw 8020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
   y dw 9210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends

inc的结果:

add的结果:

 

可以发现修改数据后,结果发生了变化。 

由于修改后的数据产生了进位,而后16位的运算需要用到前16位的进位值,因此不能使用add,add会对CF标志寄存器产生影响,而inc不会。

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

 

 

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

答:从键盘输入一个字符,并将其存入数据段中偏移地址为si的位置。每输入一个字符,si就进行自增运算,并且无条件地跳转到标记s1处,直至输入字符为“#”时,执行je next指令,跳转到标记next处。

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

答:0AH是换行符的十六进制ASCII码值,因此功能是输出换行符。

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

        答:将数据段中长度为si的字符串输出。

三、实验任务3

  • task3.asm源码
assume cs:code,ds:data
data segment
    x dw 91, 792, 8536, 65521, 2021
    len equ $ - x
data ends
stack segment
    db 64 dup(0)
    top equ $+1
stack ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov sp,top

    mov cx,len/2
    mov bx,0
s1:  
    mov ax,ds:[bx]
    push bx
    push cx
    call printNumber
    call printSpace
    pop cx
    pop bx
    add bx,2
    loop s1

    mov ah,4ch
    int 21h

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

s3:
    mov ah,2
    pop dx
    or dl,30h
    int 21h
    loop s3
    ret

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

code ends
end start
  • 运行测试截图

四、实验任务4

  • task4.asm
 1 assume cs:code, ds:data
 2 data segment
 3         str db "assembly language, it's not difficult but tedious"
 4         len equ $ - str
 5 data ends
 6 
 7 stack segment
 8         db 16 dup(0)
 9 stack ends
10 
11 code segment
12 start:
13         mov ax, data
14         mov ds, ax
15 
16         mov cx, len
17         mov si, offset str
18         call strupr
19 
20         mov ah, 4ch
21         int 21h
22 strupr:
23 s:      mov al, byte ptr ds:[si]
24         cmp al, 'a'
25         jb next
26         cmp al, 'z'
27         ja next
28 
29         mov ah, 2               
30         and al, 11011111b       
31         mov dl, al
32         int 21h                
33         inc si
34         loop s
35 
36         cmp cx, 0
37         je return
38 
39 next:   mov ah, 2               
40         mov dl, al
41         int 21h
42         inc si
43         loop s
44 return:
45         ret
46 code ends
47 end start
  • 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

 

五、实验任务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,若是,则输出yes;若不是,则输出no。

六、实验任务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
  • 运行结果

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

 答:中断也是异常的一种,中断有硬中断(由硬件产生的中断)和软中断(软件产生的中断)之分。ARM有七种不同的中断源,在中断向量表中对应的地址范围是          0X00 ~ 0X1C。CPU在执行程序时,是否响应中断要取决于以下三个条件能否同时满足:①有中断请求;②允许CPU接受中断请求;③一条指令执行完,下一          条指令还没有开始执行。

       软中断执行由SWI指令产生,用于用户模式下的程序调用特权操作指令。是通过int指令引起的中断处理,不需要识别总线周期,中断号在指令中给出。

       task6_1实现了向量表的设置,安装中断代码,task6_2向CPU发出中断指令,因此实现了42号中断处理程序。

  • 自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。(选做 *)
  • 如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。

 

posted @ 2021-12-10 16:28  olivia余一  阅读(36)  评论(2)    收藏  举报