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

 可以,本题data段数据共占32字节,di,si最大取值为20h,10h,均不超过16位寄存器上限,不会产生溢出,不会影响到cf标志位,故此题中可以将inc指令替换为add指令

  • 在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,实现的功能是?

          调用1号子功能获取用户输入并判断,若为#则停止读取并跳转到标号next处,否则si加一,继续读取输入

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

          调用2号子功能在屏幕数打印一个空格

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

           调用2号子功能,将先前读取的用户输入按原序输出

 

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 stack segment
 8     dw 5 dup(0)
 9 stack ends
10 code segment
11 start:
12     mov ax,stack
13     mov ss,ax
14 
15     mov ax,data
16     mov ds,ax
17     mov si,0
18 s0:    ;从data读取数据
19     mov sp,0ch
20     mov ax,ds:[si]
21     ;输出该数
22     call printNumber
23     inc si
24     inc si
25     cmp si,len
26     jb s0
27 
28     mov ah,4ch
29     int 21h
30 printNumber:
31     ;循环除bl(10)取余
32     mov bl,0ah
33     mov cx,0
34 s1:    mov dx,0
35     div bx
36     inc cx
37     ;余数入栈
38     push dx
39     ;商小于10则停止
40     cmp ax,0ah
41     jae    s1
42     mov dl,al
43     mov ah,2
44     add dl,'0'
45     int 21h
46     ;出栈输出
47 s2:    pop dx
48     
49     add dl,'0'
50     int 21h
51     loop s2
52     ;空格
53     mov dl,' '
54     int 21h
55     ret
56 
57 code ends
58 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 si,0
13     mov cx,len
14     call strupr
15 
16     mov ah,4ch
17     int 21h
18 strupr:
19     ;判断是否为小写字母
20     cmp ds:[si],byte ptr 'a'
21     jb s1
22     cmp ds:[si],byte ptr  'z'
23     ja s1
24     ;位运算取反,转换为大写
25     xor ds:[si],byte ptr 020h
26 s1:    inc si
27     loop strupr
28     ret
29 code ends
30 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

 

 输入2

 

 输入a

 

  • 程序的功能是?

判断键盘输入是否为7,并依据结果在屏幕第24行70列输出yes或no

6. 实验任务6

此部分书写内容:

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

 

 在6_1运行结束后,6_2还可以调用6_1设置的42号中断,中断可以看做常驻内存的一段程序

 

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

选用的中断码为f1,实现的功能为实验2中的第2个实验任务,在屏幕最下方输出红色爱心

task6.asm

 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     ;ds[si]指向程序中要复制的指令
 6     mov ax,cs
 7     mov ds,ax
 8     mov si,offset intf1
 9     ;es[di]指向目标处
10     mov ax,0
11     mov es,ax
12     mov di,200h
13     mov cx,offset intf1End - offset intf1
14     cld
15     rep movsb
16     ;向量表
17     mov ax,0
18     mov es,ax
19     mov word ptr es:[241*4],200h
20     mov word ptr es:[241*4+2],0
21     
22     mov ah,4ch
23     int 21h
24     
25 intf1:    
26     mov ax,0b800h
27     mov ds,ax
28     mov bx,0f00h
29 
30     mov cx,0a0h
31     mov si,0
32 s:    mov ax,0403h
33     mov [bx+si],ax
34     inc si
35     inc si
36     loop s
37     
38     iret
39 intf1End:
40     nop
41 code ends
42 end start

task6_2.asm

 1 assume cs:code
 2 
 3 code segment
 4 start:
 5     int 0f1h
 6 
 7     mov ah, 4ch
 8     int 21h
 9 code ends
10 end start

输出截图

 

 

五、实验总结(选) 

  中断相当于一段常驻内存的程序,要自定义中断只需将对应的代码复制到内存空间中,并将起始地址设置到中断向量表中对应处

posted @ 2021-12-14 08:55  439qi  阅读(81)  评论(1)    收藏  举报