微机原理实验报告.docx
《微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![微机原理实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/75895eed-844d-49b0-b122-9f6b2d7c8245/75895eed-844d-49b0-b122-9f6b2d7c82451.gif)
微机原理实验报告
微机原理实验报告
电信班宋力学号
一.基本程序文件(与文件)的生成
汇编语言是最接近机器语言的一门编程语言,显然用汇编语言生成文件要比其他语言(如语言)要麻烦一些,其主要过程如下:
.我们首先建立一个格式的文件(如),该格式的文件可以在后面被编译
.建立好文件后我们就可以开始编写代码了,汇编语言程序的一般格式如下:
''
(?
)
;以下为数据的定义部分
;以下为主题代码部分
程序的首部分()为堆栈段的定义,个字大小的堆栈空间对于一般的程序已经完全够用了,这一部分在以后的程序设计过程中一般是不需要修改的。
接下来()是数据段,里面可以定义程序中要用到的数据,或者开辟一片存储空间以供后面使用,需要注意的一点是,汇编语言的数据类型是以数据的大小来区分的,如字节,字,双字等等,而语言中则提供了标准的数据类型(如等),相比语言而言,汇编语言的数据定义底层一些。
再下来()就是程序的代码段了,可以看出就算是一个空的程序(不执行其他操作)也要写很多的代码,我自己认为在初学的时候不需要太在意这些细节问题,一种简便的方法是直接把代码段的这些框架似的语句直接当作语言里面的(){}就可以了,我们可以在暂时不了解它的情况下完成自己的程序。
.写完了上面的代码后我们的汇编源文件就已经建立好了,接下来就可以进入调试并生成可执行文件了,这里可以利用指令和指令,用指令可以生成
目标文件(),用指令可以对目标文件进行链接,并生成我们想要的文件,它与语言里面完全一样。
通过以上步骤,如果没有出现错误,那么一个可执行文件就已经生成好了。
(对于文件可以在调试中生成,也比较简单,在次不做说明)
二文件的内存映像图及其与寄存器内容的关系
同样我们也可以以一个简单的程序为例,该程序如下:
''
(?
)
'1A$'
在程序运行到处时,程序寄存器的内容如下:
可以看到与同时指向程序段前缀的起始地址,指向数据段起始地址,
指向代码段地址,由此我们可以画出程序的内存映像图如下:
……
()
堆栈段()
数据段()
代码段
……
堆栈段
数据段堆栈段长度
代码段用户数据段长度(有以上表格可以验证其正确性)
三.常用调试命令的使用
汇编语言的调试与编译器下的断点调试功能相仿(相当于指令相当于指令),这些调试方法可以帮助我们尽快的找出程序中的问题,但是由于的局限性使得我们在调试的过程中会遇到许多的不便,通过这段时间的微机原理实验,我总结了一些调试方面的方法与技巧,通过以下程序来进行说明:
复习题从键盘输入一个无符号的十六进制数(位),在显示器上以十进制形式显示其真值
''
(?
)
(?
)
(?
),'$'
[]
:
[]
:
:
[]
A.数据的预置
通过号功能调用进行数据的预置
输入数据:
以上语句执行以后数据区的内容如下:
B.数据的修改
在第一个指令结束时用指令修改中寄存器的内容为:
C.查看结果
可以通过观察数据区或寄存器中的值来查看结果,也可以通过指令的调用来查看结果,后者在验证输出结果正确性的时候更为方便:
执行完以上语句后窗口下输出如下:
即输出的结果为,正好为的十进制表示,所以我们可以判断结果正确
D.单步执行
通过指令可以单步执行,在执行指令会跳到其内部
E.断点执行
可以通过指令跳到指定的位置,它一般与指令混合使用
F.连续执行
通过指令可以连续执行,如:
四.汇编语言程序的设计与调试总结
汇编程序的设计相对于其他高级语言来说更为底层,基本上与高级语言的设计模式没有相关性,它主要是通过各较小的功能模块的实现来搭建我们想要的程序,其中参数的传递较为麻烦,并且模块之间的耦合性一般较大。
现在我以第三章的第题为例来说明一下如何设计一个较复杂的汇编程序:
题目:
编写程序,实现接收键入的一串以逗号分隔的十进制正数(十进制正数均小于,个数不超过个),并将其中的最大值送显示。
要求把键入的码形式的十进制数转换为压缩数,求十进制数的个数,求最大值的程序分别编写为子程序。
首先我们要设计好正确的程序流图,如下:
由以上流图则可以将该程序分为如下几个模块:
.将十进制字符串转换为数并存储于指定的存储区中
.求十进制的数目
.求指定区域中的数的最大值
.显示数
由于是允许输入的十进制数最大值为,故每个数占用两个字节,最大输入的十进制数为个,因此为可以为定义个存储单元,同理若占用个存储单元也可以保证输入不会越界
接下来是各功能模块的设计:
模块:
.接口设计
函数名
:
传入十进制字符的首地址
:
转化后的压缩数在偏移的地址中
会增加
会改变到下一个逗号后
.函数内部算法设计
将程序中用到的某些寄存器压栈
将中的偏移地址放入变址寄存器中
将地址后第一个逗号前的所有十进制码转换为一个十六进制数并存于中
将中的十六进制数转换为数并存于指向的地址中
压栈的积存器出栈
模块
.接口设计
函数名
:
传入字符串的首地址
中传入字符的个数
:
中返回数目
.函数内部算法设计
将程序中用到的某些寄存器压栈
通过计算中逗号的数目得到十进制数的个数,存于中
压栈的积存器出栈
模块
.接口设计
函数名:
:
存放数目
:
存放串的首地址
:
存放最大的数
.函数内部算法设计
将程序中用到的某些寄存器压栈
将中存
逐个比较与数的大小,若<,则交换,最后得到的就是最大值
压栈的积存器出栈
模块
1.接口设计
函数名:
:
将中存入要显示的数
:
将中存放的数显示出来
2.函数内部算法设计
将程序中用到的某些寄存器压栈
显示中的两位压缩数
显示中的两位压缩数
压栈的积存器出栈
程序清单如下:
''
(?
)
(?
);接收输入的一串以逗号分隔的正数
(?
);转换为后的十进制串
?
;输入正数的个数
;用户输入字符串到存储区中
;为方便后面的操作,可以在输入的串后面再加上一个逗号
','
[]
[]
;求输入的字符数目(加上后面补上的个逗号)
[]
;将输入字符串中的十进制数(码表示)转换为数,并且存入
;存储区中
:
;遍历存储区中的存储的数以求得最大值,存入中
;最大值压栈
;换行
;显示中存储的最大值
;换行
;最大值出栈并显示
;函数名
:
传入十进制字符的首地址
:
转化后的压缩数在偏移的地址中
会增加
会改变到下一个逗号后
:
[]
[],','
;跳过逗号
[]
[]
[]
[]
;函数名
:
传入字符串的首地址
中传入字符的个数
:
中返回数目
:
[]
','
:
;函数名:
:
存放数目
:
存放串的首地址
:
存放最大的数
:
[]
:
[]
:
[]
[]
:
;函数名:
:
将中存入要显示的数
:
将中存放的数显示出来
该程序由于存在多个功能模块,所以最开始可以就单个的功能模块进行调试,最后再将各模块连接起来一起调试,在各功能模块的调试中我基本上没有碰到什么问题,下面仅以最后完整程序的调试来进行说明:
.用户输入的数据为:
.后寄存器的内容如下:
中的值为表示十进制数的个数(正确)
.循环执行完后内存如下
可见内存中的数正确
后寄存器的内容如下:
中存储的是最大值(正确)
.执行后窗口下的输出是为:
显示的结果正确
由此可见该程序已经得到了正确的执行。
五.汇编语言的学习体会
对于汇编语言的学习,我觉得可以在与其他语言(如语言)的比较中进行。
我认为通过对其程序设计,函数调用,调试方法的比较可以让我们更好的学习这门语言,而且,值得注意的一点是,任何语言的学习都必须经过不断的实践才能学好,汇编语言更是这样,在不断的实践中我们会碰到各种问题,而解决问题会使我们从中受益。
汇编语言的调试比较麻烦,而且指令也比较多,稍没搞好就会出问题然后就得重来,比如说当我们调试某个程序时,不小心用指令跳过了有输入的语句,由于没有进行输入,导致死机,从而不得不重来,另一个问题是在时一般不能用指令而最好用指令,以免进入内部;还有就是调试的时候经常听到嘀嘀声,开始不明白是出了什么问题,到处找错误,其实原因可能是输出串中少了一个结束符或是的偏移地址错误等等。
当然,在编程的过程中我还碰到了许许多多其他方面的问题并且最后把他们一一解决,最后我想说的是:
学一门语言或者做任何事情都是一个不断实践,不断出错,不断改正的过程。