太原理工大学微机原理实验报告.docx
- 文档编号:2911824
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:25
- 大小:187.51KB
太原理工大学微机原理实验报告.docx
《太原理工大学微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《太原理工大学微机原理实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
太原理工大学微机原理实验报告
太原理工大学微机原理实验报告
LT
图1-1程序流程图
3、程序清单:
完整指令代码如下(简化段定义格式):
.modelsmall;定义程序的存储模式
.486;说明使用的80x86微处理器指令
.stack;定义堆栈段
.data;定义数据段
Stringdb'Hello,world!
','$'
.code;定义代码段
.startup;程序执行开始
Movax,segString;把String的段地址送ax
Movds,ax;ax送ds,ds取得string的段地址
movdx,offsetString;String的偏移地址送dx
movah,9;字符串显示功能
int21h;DOS功能调用
movax,4c00h
int21h;返回DOS
.exit
end
三、结果与分析
指导教师:
年月
实验二内存数据的移动
一、实验要求与目的:
1、实验要求:
编写程序实现把数据段的字符串数据移动到附加段中。
2、实验目的:
通过项目学习汇编的数据传送指令和串处理类指令,巩固寻址方式,学习汇编程序设计。
二、实验内容:
1、项目要求:
把数据段中以dstring地址标号为开始地址的“helloworld!
”字符串移动到附加段以sstring地址标号为开始地址中去。
2、设计思想:
从源串中取一个字符到AL中,然后把刚取到的字符放到目的串指定位置,重复这样的过程,把源串的字符取完为止。
程序流程如图2-1所示。
图2-1程序流程图
3、程序设计清单:
实现这样功能的程序方法很多,下面给出了实现这一功能的完整程序清单(完整段定义格式)。
方案一(无聊版):
采用的是loop指令,CX为循环次数,当CX为0时退出循环。
加入了换行指令。
用字符串常量’$’改变字符串,提前终止字符串的输出。
程序如下:
DSEGSEGMENT
dstringDB'HELLO,WORLD!
',33,33,'$';15个字节HELLO,WORLD!
!
!
dstring_1db'数据段的字符串:
','$';一定要加'$',表示一个字符串的结束
dstring_2db'附加段的字符串:
','$';在屏幕上显示的字符串
DSEGENDS
ESEGSEGMENT
sstringDB15DUP(?
);附加段预留15个字节空间
ESEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DSEG,ES:
ESEG
start:
MOVAX,DSEG;程序开始执行的地方
MOVDS,AX;将DSEG的段地址给ds
MOVAX,ESEG
MOVES,AX;将SSEG的段地址给es
LEASI,dstring;将dstring的首地址给si
LEADI,sstring;将sstring的首地址给di
MOVCX,15;CX存放loop指令的循环次数
S:
MOVAL,[SI]
MOVES:
[DI],AL
INCDI
INCSI
LOOPS
movdX,offsetdstring_1
MOVAH,09h
INT21H;输出字符串‘数据段的字符串:
’
MOVDL,0AH;输出换行
MOVAH,02H
INT21H
movdX,offsetdstring
MOVAH,09h
INT21H;输出字符串:
HELLO,WORLD!
!
!
MOVDL,0AH
MOVAH,02H
INT21H;输出换行
movdX,offsetdstring_2
MOVAH,09h
INT21H;输出字符串dstring_2
MOVDL,0AH
MOVAH,02H
INT21H;输出换行
moval,'$'
moves:
[di-3],al;将第二个'!
'改成'$'以终止字符串的继续输出
MOVAX,ES
MOVDS,AX;将附加段的段地址附给数据段
movdX,offsetsstring
MOVAH,09h
INT21H;显示字符串HELLO,WORLD!
注意不是!
!
!
MOVAX,4C00H
INT21H;返回DOS
CODEENDS;代码段结束
ENDstart;程序结束
方案二:
采用字符串操作指令movsb,执行[di]=[si]。
Si与di自动地址改变方向,由std,cld控制。
Cx作为计数器,前面应用rep指令重复。
程序如下:
DSEGSEGMENT
dstringDB'HELLO,WORLD!
','$';13个字节HELLO,WORLD!
!
!
DSEGENDS
ESEGSEGMENT
sstringDB13DUP(?
);附加段留13个字节空间
ESEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DSEG,ES:
ESEG
start:
MOVAX,DSEG;程序开始执行的地方
MOVDS,AX;将DSEG的段地址给ds
MOVAX,ESEG
MOVES,AX;将SSEG的段地址给es
LEASI,dstring;将dstring的首地址给si
LEADI,sstring;将sstring的首地址给di
MOVCX,13;CX存放rep指令的重复次数
cld;将DF位清零,则di与si自增
repmovsb;执行[di]=[si]
MOVAX,ES
MOVDS,AX;将附加段的段地址附给数据段
movdX,offsetsstring
MOVAH,09h
INT21H;显示字符串HELLO,WORLD!
!
!
MOVAX,4C00H
INT21H;返回DOS
CODEENDS;代码段结束
ENDstart;程序结束
方案三:
采用是cmp与ja跳转指令来实现数据的移动。
程序如下:
DSEGSEGMENT
dstringDB'HELLO,WORLD!
','$';13个字节HELLO,WORLD!
!
!
DSEGENDS
ESEGSEGMENT
sstringDB15DUP(?
);附加段留13个字节空间
ESEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DSEG,ES:
ESEG
start:
MOVAX,DSEG;程序开始执行的地方
MOVDS,AX;将DSEG的段地址给ds
MOVAX,ESEG
MOVES,AX;将SSEG的段地址给es
LEASI,dstring;将dstring的首地址给si
LEADI,sstring;将sstring的首地址给di
MOVCX,13;CX存放循环次数
S:
MOVAL,[SI]
MOVES:
[DI],AL
INCDI
INCSI
DECCX
CMPCX,0
JAS
MOVAX,ES
MOVDS,AX;将附加段的段地址附给数据段
movdX,offsetsstring
MOVAH,09h
INT21H;显示字符串HELLO,WORLD!
MOVAX,4C00H
INT21H;返回DOS
CODEENDS;代码段结束
ENDstart;程序结束
附简化段定义格式如下:
.modelsmall;定义程序的存储模式
.486;说明使用的80X86微处理指令
.data;定义数据段开始
dstringdb'hello,world!
','$'
sstringdb13dup(0);使用的同一个数据段
.code;定义代码段
.startup;程序开始执行的地方
movax,segdstring;=movax,@data
movds,ax;将dstring的段地址附给ds
moves,ax;为了使用movsb指令,由于两个字符串都在数据段,所以令es=ds
leasi,dstring
leadi,sstring
movcx,13;循环次数
cld
repmovsb
movdx,offsetsstring
movah,9
int21h
movax,4c00h
int21h
.exit
End
4、调试过程:
(在win7x32下调试的方案二)
第1步:
进入debug:
命令debug+file.exe。
第2步:
用r命令查看cpu寄存器内容,这一步基本没用。
看注意点即可
注意:
此时并未给ds,es赋值,在ds,es赋值之前有ds=es,cs=ds+10h。
第3步:
用U命令查看汇编指令。
直接暴力输入g001a也可,但只适用本程序。
第四步:
用T命令执行一条机器指令。
这里了执行四次。
此时可以看到ds和es已经赋值了,此时来查看内存的内容。
注意cs没变。
第五步:
用d命令查看内存的内容。
即查看DS:
0和ES:
0输入d0bc6:
0和d0bc7:
0。
可以看出已经完成移动了。
三、结果与分析
没仔细去看为什么0bc6:
0010处也有hello,world。
我调试过了发现还有,猜测可能与ss的栈有关。
四、拓展
用q命令退出debug。
用p命令一次执行完循环。
用g+偏移地址(ip),可以直接执行到上一条指令,即此时IP=ip。
教师点评:
指导教师:
年月日
实验三分支程序结构
一、实验要求与目的:
1、实验要求:
掌握分支结构程序设计的基本方法;掌握无条件转移指令和条件转移指令的使用;掌握分支结构程序设计的两种基本结构的使用。
2、实验目的:
通过分支程序的设计掌握结构化程序设计方法和常用算法设计。
二、实验内容:
1、项目要求:
编写程序实现:
在数据段中,有一个按从小到大顺序排列的无符号数组,其首地址存放在SI寄存器中,数组中的第一个单元存放着数组长度。
在key单元中有一个无符号数,要求在数组中查找是否存在[key]这个数,如找到,则使CF=0,并在DI中给出该单元在数组中的偏移地址;如未找到,则使CF=1。
2、设计思想:
对于这个表格查找,可以使用顺序查找和折半查找的算法思想。
当然顺序查找程序简单,效率不高。
而折半查找程序复杂,效率高,但对查找数据要求有序。
本项目采用折半查找方式。
在一个长度为N的有序数组r中,查找元素k的折半查找算法可描述如下:
①初始化被查找数组的尾下标,low←1,high←n。
②若low>high,则查找失败,CF=1,退出程序;否则,计算中点mid←(low+high)/2。
③k与中点元素r[mid]比较。
若k=r[mid],则查找成功,结束程序;若k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 太原 理工大学 微机 原理 实验 报告