ICode9

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

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

2021-12-16 15:31:58  阅读:171  来源: 互联网

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


实验任务1

验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。 在debug环境中,分别实践、观察: ① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响? 对 ZF 和 CF 标志位都有影响     ② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响? 对 ZF 标志位有影响,但是对 CF 标志位没有影响

 

① line31~line34 的 4 条 inc 指令,能否替换成

add si, 2

add di, 2

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

不能改为add __, 2,因为add影响到了标志位,而ADC正是用到标志位的指令

 前:

 

后:

 

 

 

实验任务2

 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#),观察结果: 

 

  运行程序,从键盘上输入一串字符,以 #结束(比如,输入 George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题: ① 汇编指令代码 line11-18,实现的功能是? 调用int 21h的1号输入功能,从键盘上读入一个不是 #的字符存入 al。 ② 汇编指令代码 line20-22,实现的功能是? 调用int 21h的2号输出功能,输出dl存放的换行。 ③ 汇编指令代码 line24-30,实现的功能是? 调用int 21h的2号输出功能,输出dl存放的字符 

实验任务3

 

针对8086CPU,已知逻辑段定义如下:

1 data segment
2 x dw 91, 792, 8536, 65521, 2021
3 len equ $ - x
4 data ends

编写8086汇编源程序task3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据 之间以空格间隔。

要求:

编写子程序printNumber

功能:以十进制形式输出一个任意位数的整数(整数范围0 ~ 65535)

入口参数:寄存器ax(待输出的数据 --> ax)

出口参数:无

编写子程序printSpace

功能:打印一个空格

入口参数:无

出口参数:无

在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。

 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 stack segment
 9           db 16 dup(0)
10 stack ends
11 
12 code segment
13 start:      
14         mov  ax, data
15         mov  ds, ax
16 
17         mov  si,offset x
18         mov  cx,5
19 
20 s:          
21         mov  ax,[si]
22         call printNumber
23         call printSpace
24 
25         inc  si
26         inc  si
27         loop s
28 
29         mov  ah, 4ch
30         int  21h
31 printNumber:
32         push bx
33         push di
34         push cx
35 
36         mov  cx,0
37         mov  di,0
38 to10:       
39         mov  dx,0 ;除 余数推 栈
40         mov  bx,10
41         div  bx
42         or   dl,30h
43         push dx
44         inc  di
45         cmp  ax,0
46         jne  to10
47         mov  cx,di
48 cout:       
49         pop  dx 
50         mov  ah,2
51         int  21h
52         loop cout
53 
54         pop  cx
55         pop  di
56         pop  bx
57         ret
58 
59 printSpace: 
60         mov  dl,' '
61         int  21h
62         ret
63 code ends
64 end start

 

 

实验任务4

针对8086CPU,已知逻辑段定义如下:

1 data segment
2 str db "assembly language, it's not difficult but tedious"
3 len equ $ - str
4 data ends

编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。

要求:

编写子程序strupr

功能:将包含任意字符的字符串中的小写字母变成大写

入口参数

   (ds:si ) 字符串首地址的段地址和偏移地址分别送至ds和si

   (cx) 字符串的长度

出口参数:无

在主体代码中,设置入口参数,调用strupr, 实现题目要求。

 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 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     mov si,offset str
11     mov cx,len
12     call strupr
13     mov ah,4ch
14     int 21h
15 strupr:
16     mov ax,0
17     mov al,ds:[si]
18     cmp al,61h
19     jb continue
20     sub al,20h
21     mov ds:[si],al
22     continue:
23         inc si
24         loop strupr
25         ret
26 code ends
27 end start

运行结果,正常

运行前

 

 运行后

 

实验任务5

使用任意文本编辑器,录入8086汇编源码task5.asm。

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

 

对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe。

运行程序,输入7,观察结果。输入其他字符,观察结果。结合运行结果和注释,理解代码实现的功能。

说明:task5.asm中,使用用到的DOS系统功能调用和BIOS中断例程

 

 

 

程序功能:键盘输入一个字符,若是”7”,则在第24行,第70列显示字符串”yes”,否则,在第24行,第70列显示字符串”no”。

 

实验任务6

实验任务1、2、3、5中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个42号软中断 例程,使得通过 int 42 或 int 2ah 软中断调用,实现在屏幕最下方中间以黑底绿字打印"welcome to 2049!"。

建议配合教材第12章学习理解并实践。

task6_1.asm

 

 

 

标签:8086,中断,mov,int,si,寄存器,ax,data,21h
来源: https://www.cnblogs.com/wanchengwildman/p/15671163.html

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

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

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

ICode9版权所有