实验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 ;将‘进位标志位’置为0
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可能改变进位标志位的值,从而影响 adc ax, [di] 的执行,而 inc 指令不会改变进位标志位的值。

但是本题数据特殊,add si, 2 与 add di, 2并不会产生进位,所以替换代码之后程序的执行结果并不会改变。

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

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

 

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

运行测试截图:

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

回答问题:

① 汇编指令代码line11-18,实现的功能是:从键盘一个接一个的读入字符,判断是否为‘#’,若是则跳转到next处执行,若不是则计数并继续读入下一个字符

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

③ 汇编指令代码line24-30,实现的功能是:输出刚刚读入的一串字符,#不输出

 

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, len/2
14 
15 s:  
16     mov ax, [si] ;数据低位(被除数)
17     mov dx, 0 ;数据高位(被除数)
18     push cx
19     call printNumber
20     call printSpace
21     pop cx
22     add si, 2
23     loop s
24 
25     mov ah, 4ch
26     int 21h
27 
28 printNumber:
29     mov di, 0 ;记录数据位数
30     mov bx, 10 ;除数为10
31 s1:    
32     div bx
33     push dx
34     inc di
35     mov dx, 0 ;被除数要及时更新!!!!!!
36     cmp ax, 0 ;循环结束条件
37     je next
38     jmp s1
39 next:
40     mov cx, di
41     mov ah, 2
42 s2:
43     pop dx
44     or dl, 30h ;转换为10进制
45     int 21h
46     loop s2   
47 ret
48 
49 printSpace:
50     mov ah, 2
51     mov dl, ' '
52     int 21h
53 ret
54 
55 code ends
56 end start

运行测试截图

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

 

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, offset str
13     mov cx, len
14 s:  
15     call strupr
16     inc si
17     loop s
18 
19     mov ah, 4ch
20     int 21h
21 
22 strupr:
23     mov al, [si]
24     cmp al, 'a'
25     jb ok ;小于则返回
26     cmp al, 'z'
27     ja ok ;大于也返回
28     and al, 11011111b
29     mov [si], al
30 ok: ret    
31 
32 code ends
33 end start

call strupr 调用之前,数据段的值:

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

 call strupr 调用之后,数据段的值:实验4 8086标志寄存器及中断

 

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,以及输入其他字符,运行结果截图)

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

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

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

程序的功能是:读入一个字符并判断是否为'7',若为'7',在第0页第24行70列输出yes并退出,否则输出no并退出。

 

6. 实验任务6

运行结果:

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

中断是指由于接收到外围硬件(相对于CPU与内存而言)的异步信号或者来自软件的同步信号而进行相应的硬件/软件处理。 显然,外围硬件发给CPU或者内存的异步信号就是硬中断信号。由软件本身发给操作系统内核的中断信号,称之为软中断。

task6_1.exe,实现将 42号中断处理程序安装到0:200开始的连续内存空间,并设置中断向量表,使得将来通过 int 42 系统可以跳转到中断处理程序。

task6_2.exe,向CPU发出中断指令,实现了42号中断处理程序。

上一篇:P1094 [NOIP2007 普及组] 纪念品分组 java洛谷


下一篇:实验三