太原理工大学微机原理实验报告Word下载.docx
《太原理工大学微机原理实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《太原理工大学微机原理实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
![太原理工大学微机原理实验报告Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/5f959ad8-65e9-4e9c-8b0d-e7f7eedaaa10/5f959ad8-65e9-4e9c-8b0d-e7f7eedaaa101.gif)
ax送ds,ds取得string的段地址
movdx,offsetString;
String的偏移地址送dx
movah,9;
字符串显示功能
int21h;
DOS功能调用
movax,4c00h
返回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
输出字符串:
MOVDL,0AH
INT21H;
movdX,offsetdstring_2
INT21H;
输出字符串dstring_2
moval,'
moves:
[di-3],al;
将第二个'
改成'
以终止字符串的继续输出
MOVAX,ES
MOVDS,AX;
将附加段的段地址附给数据段
movdX,offsetsstring
显示字符串HELLO,WORLD!
注意不是!
MOVAX,4C00H
CODEENDS;
代码段结束
ENDstart;
程序结束
方案二:
采用字符串操作指令movsb,执行[di]=[si]。
Si与di自动地址改变方向,由std,cld控制。
Cx作为计数器,前面应用rep指令重复。
13个字节HELLO,WORLD!
sstringDB13DUP(?
);
附加段留13个字节空间
ASSUMECS:
MOVAX,DSEG;
MOVDS,AX;
MOVAX,ESEG
MOVES,AX;
将SSEG的段地址给es
LEASI,dstring;
LEADI,sstring;
MOVCX,13;
CX存放rep指令的重复次数
cld;
将DF位清零,则di与si自增
repmovsb;
执行[di]=[si]
MOVDS,AX;
方案三:
采用是cmp与ja跳转指令来实现数据的移动。
'
);
MOVAX,DSEG;
MOVDS,AX;
MOVES,AX;
LEASI,dstring;
LEADI,sstring;
MOVCX,13;
CX存放循环次数
MOVAL,[SI]
DECCX
CMPCX,0
JAS
MOVDS,AX;
INT21H;
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
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。
教师点评:
年月日
实验三分支程序结构
掌握分支结构程序设计的基本方法;
掌握无条件转移指令和条件转移指令的使用;
掌握分支结构程序设计的两种基本结构的使用。
通过分支程序的设计掌握结构化程序设计方法和常用算法设计。
编写程序实现:
在数据段中,有一个按从小到大顺序排列的无符号数组,其首地址存放在SI寄存器中,数组中的第一个单元存放着数组长度。
在key单元中有一个无符号数,要求在数组中查找是否存在[key]这个数,如找到,则使CF=0,并在DI中给出该单元在数组中的偏移地址;
如未找到,则使CF=1。
对于这个表格查找,可以使用顺序查找和折半查找的算法思想。
当然顺序查找程序简单,效率不高。
而折半查找程序复杂,效率高,但对查找数据要求有序。
本项目采用折半查找方式。
在一个长度为N的有序数组r中,查找元素k的折半查找算法可描述如下:
①初始化被查找数组的尾下标,low←1,high←n。
②若low>
high,则查找失败,CF=1,退出程序;
否则,计算中点mid←(low+high)/2。
③k与中点元素r[mid]比较。
若k=r[mid],则查找成功,结束程序;
若k<
r[mid],则转步骤④;
若k>
r[mid],则