ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-12 12:04:51  阅读:141  来源: 互联网

标签:8086 code 中断 mov int si 寄存器 ax data


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位加之前和加之后,数据段的值的变化。给出调试观察截图。

 

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

运行测试截图:

回答问题:

① 汇编指令代码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. 实验任务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 调用之前,数据段的值:

 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',若为'7',在第0页第24行70列输出yes并退出,否则输出no并退出。

 

6. 实验任务6

运行结果:

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

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

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

标签:8086,code,中断,mov,int,si,寄存器,ax,data
来源: https://www.cnblogs.com/lmj0228/p/15671193.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有