太原理工大学微机原理实验报告Word下载.docx

上传人:b****3 文档编号:15822846 上传时间:2022-11-16 格式:DOCX 页数:25 大小:187.51KB
下载 相关 举报
太原理工大学微机原理实验报告Word下载.docx_第1页
第1页 / 共25页
太原理工大学微机原理实验报告Word下载.docx_第2页
第2页 / 共25页
太原理工大学微机原理实验报告Word下载.docx_第3页
第3页 / 共25页
太原理工大学微机原理实验报告Word下载.docx_第4页
第4页 / 共25页
太原理工大学微机原理实验报告Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

太原理工大学微机原理实验报告Word下载.docx

《太原理工大学微机原理实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《太原理工大学微机原理实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

太原理工大学微机原理实验报告Word下载.docx

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],则

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1