【汇编实验】实验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

你的结论的依据/理由是什么?

不可以,因为使用add可能会产生进位,这样就影响到了line28的adc指令运行

 

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

 

 

在做运算之前的数据段。

 

做完运算之后的数据段,可以发现076a0~076af是已经加完之后的结果。

 

 

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

调用int 21h 的一号子功能,从键盘上输入字符并将其ASCII码存放在al中,一直做循环直到输入#作为结束标志。

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

调用int 21h 的二号子功能,并向dl中存放换行符的ASCII码,在屏幕上输出换行符,为接下来重复输出这个字符串做准备。

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

重复调用int 21h 的二号子功能,输出之前输入的字符串

3. 实验任务3

task3.asm源码

 1 assume ds:data, cs:code, ss:stack
 2 data segment
 3   x dw 91, 792, 8536, 65521, 2021
 4   len equ $ - x
 5 data ends
 6 stack segment
 7   dw 8 dup(0)
 8 stack ends
 9 
10 code segment
11   start:
12     mov ax, data
13     mov ds, ax
14     mov ax, stack
15     mov ss, ax
16     mov sp, 16
17     mov si,  offset x 
18     mov cx, len/2 ;
19     s:
20       mov ax, [si]
21       mov dx, 0
22       call printNumber
23       call printSpace
24       inc si
25       inc si
26       loop s
27     mov ah, 4ch
28     int 21h
29 
30   printNumber:
31     push cx 
32     mov cx, 0
33     s1:
34       mov dx, 0
35       mov bx, 10
36       div bx
37       push dx
38       inc cx
39       cmp ax, 0
40       jne s1
41     s2:
42       pop dx
43       or dl, 30h
44       mov ah, 2
45       int 21h
46       loop s2
47   pop cx
48   ret
49 
50   printSpace:
51     mov dl, ' '
52     mov ah, 2
53     int 21h
54   ret
55 
56 code ends
57 end start

 

运行测试截图

 

 

 

 

4. 实验任务4

task4.asm源码

 1 assume cs:code, ss:stack, 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(0)
 9 stack ends
10 
11 code segment
12 start:
13   mov ax, data
14   mov ds, ax
15   mov ax, stack
16   mov ss, ax
17   mov sp, 8
18   mov si, 0
19   mov cx, len
20   call strupr
21   call printStr
22 
23   mov ax, 4c00h
24   int 21h
25 strupr:
26   push cx
27   push si
28   trans:
29     mov al, ds:[si];
30     cmp al, 'a'
31     jl next
32     cmp al, 'z'
33     jg next
34     and al, 0dfh
35     mov ds:[si], al
36     next:
37       inc si
38       loop trans
39   pop si
40   pop cx
41   ret
42 printStr:
43   push cx
44   push si
45   print:
46     mov ah, 2
47     mov dl, ds:[si]
48     int 21h
49     inc si
50   loop print
51   pop si
52   pop cx
53   ret
54 code ends
55 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,否则输出no

6. 实验任务6

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

 

中断过程可表示为:

(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指令返回。

posted on 2021-12-10 14:35  bhjohnny  阅读(90)  评论(0编辑  收藏  举报