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

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
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指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2
add di, 2

不可以。

  • 在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,实现的功能是?
② 汇编指令代码line20-22,实现的功能是?
③ 汇编指令代码line24-30,实现的功能是?

①从键盘接收一个字符。若字符是’#’则接收结束。

②输出换行符。

③向屏幕显示输入的字符。

 

3.实验任务3

  • task3.asm源码
 1 assume cs:code,ds:data
 2 data segment
 3     x dw 91, 792, 8536, 65521, 2021
 4     len equ $ - x
 5 data ends
 6 stack segment
 7     db 64 dup(0)
 8     top equ $+1
 9 stack ends
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov ax,stack
15     mov ss,ax
16     mov sp,top
17     ;一次处理两个字节
18     mov cx,len/2
19     mov bx,0
20 s1:  
21     mov ax,ds:[bx]
22     push bx
23     push cx
24     call printNumber
25     call printSpace
26     pop cx
27     pop bx
28     add bx,2
29     loop s1
30 
31     mov ah,4ch
32     int 21h
33 
34 printNumber:
35     ;不断除以10,得到对应位的数字
36     ;ax保存被除数
37     mov bx,10
38     mov cx,0
39 s2:
40     mov dx,0
41     div bx
42     push dx
43     inc cx
44     cmp ax,0
45     jne s2
46 
47 s3:
48     mov ah,2
49     pop dx
50     or dl,30h
51     int 21h
52     loop s3
53     ret
54 
55 printSpace:
56     mov ah,2
57     mov dl,20h
58     int 21h
59     ret
60 
61 code ends
62 end start
  • 运行测试截图

 

4.实验任务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 8 dup(?)
 9 stack ends
10 
11 code segment
12 start: 
13     mov ax, data
14     mov ds, ax
15     mov si, 0
16     mov cx, len     
17     call strupr     
18     call printStr   
19 
20     mov ax, 4c00h
21     int 21h
22 
23 strupr:
24     push cx
25     push si         
26     s:
27         mov al, ds:[si] 
28         cmp al, 97     
29         jl c     
30         cmp al, 122     
31         jg c
32         and al, 0dfh
33         mov ds:[si], al
34     c:
35         inc si      
36         loop s
37 
38     pop si
39     pop cx
40     ret
41 
42 
43 printStr:
44     push cx         
45     push si
46     s2:
47         mov ah, 2
48         mov dl, ds:[si]
49         int 21h
50         inc si
51     loop s2
52 
53     pop si          
54     pop cx
55     ret             
56 
57 code ends
58 end start
  • 在debug中调试截图( 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,若不是则在第24行70列输出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中断当前运行的程序,改变CS:IP,去执行其他的程序。执行完成后,又返回原先被中断的程序继续运行。

 软中断是CPU内部产生的中断信号,CPU保存当前的执行环境。

posted @ 2021-12-16 21:35  bai_ke  阅读(32)  评论(2编辑  收藏  举报