微机原理实验一
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、实验心得
本次实验是微机原理这门课的第一次上机实验,上机之前就比较激动,因为本身也 是特别喜欢这门课,终于可以把学到的知识通过实践来自己操作。而实验课上,老师的 风趣幽默和博闻强识更加深了我对上机课的喜爱。因此,实验课结束后更激动。
在本节实验课上,我课前认真预习实验讲义,在上机实验课上熟悉了汇编语言程序 设计上机实验的计算机软硬件平台,熟悉了汇编语言程序设计上机实验的过程,掌握了 汇编语言源程序的编辑及对其汇编、连接、运行的过程,并且学会了使用DEBUG调试 和运行程序的方法。并且自己写了一个汇编的小程序,非常有成就感。
非常期待下一次的实验课。谢谢老师!
连接程序LINK对所有OBJ模块扫描两遍。 第一遍扫描对所有段分配段地址,并建立一张“外部符号表”(又称“全局符号 表”),记录外部符号(相对自身模块而言,在另外源程序模块中定义的标号、过程 名、变量名等符号)的地址和属性。 第二遍扫描确定与外部符号有关的机器指令,并创建“文件头”文件头包含操 作系统把EXE文件从磁盘调入内存所需的信息)。 由此所有指令的物理地址就被确定。 4.连接程序的主要工作是什么? 答:1)找到要连接的所有目标模块; 2)为所有要连接的目标模块中的所有段分配存储单元,即确定所有段地址
实验一 汇编语言程序设计上机实验的基本过程
——PB14000521 王艳红
〇、实验目的和要求:
1.熟悉汇编语言程序设计上机实验的计算机软硬件平台。 2.熟悉汇编语言程序设计上机实验的过程。 3.熟练掌握汇编语言源程序的编辑及对其汇编、连接、运行的过程。 4.熟练掌握使用DEBUG调试和运行程序的方法(“工欲善其事,必先利其器!“)。
在此过程中遇到的两个还没解决的小问题是关于DOSBox窗口的问题,第一是怎么能 将DOSBox窗口放大而字体不放大,第二是怎样可以实现DOSBox窗口中的翻页问题。问题 一是因为实验中确实觉得窗口太小用着不舒服,在网上找了一些方法也试了一下,但是 大多都是在将窗口放大的同事将字体也放大了。问题二是因为在DEBUG的过程中,有时 候想要上下对比但是并不能翻页看到前一页的内容所以很苦恼,希望能在老师的帮助下 得到解决。
图三:第一遍扫视主要流程
第二遍扫视(PASS2)产生机器指令代码、确定数据等,产生相应的 OBJ、LST 和 CREF 文件。
图四:第二遍扫视主要流程
2. 如何解决变量和标号的“向前引用”问题?地址“浮动”意味着什么? 答:在汇编语言的操作数字段中出现变量或标号时,若该变量或符号尚未定义,
则称为“前向引用”。 因为指令长度与操作数类型有关,而操作数类型则与有关变 量或标号的类型有关。在向后引用时,这些都是确定值,但向前引用时就会发生困 难了。
屏幕显示输出单个字符使用2号DOS功能调用,入口参数送DL寄存器。
(本题的目的就是让上机实验者亲历使用和体验一下DOS功能调用,来为下一次的实验热
身。)
要求: * 在程序运行时,先输入的小写字母在随后“自动”显示大写字母时仍在屏幕上。
* 至少能正确实现一个英文字母大小写的转换且能正常返回DOS即可,而不论转换字
开始
打印 DATA:DA1 处的字符串
结束
图一:程序一流程图
1.3 程序的清单(源程序)
数
数区
车
换
栈
栈区
节
结 标识
码 远调 过
栈区
栈
为时 值
栈为
值
数区
数区
调号
输
从
过结
义结
汇编
结
2.0 实验内容原题
2.请编写一个汇编源程序,实现从键盘输入的小写字母用大写字母在屏幕上显示出来。
提示:键盘输入单个字符并回显使用1号DOS功能调用,出口参数在AL寄存器。
1.1 程序的算法思想
a.例题中程序的主要功能是在DOS界面输出字符串“This is a sample program.”, 并自动换行。
b.程序中定义了三个段DATA、STACK和CODE。
DATA中以DA1为偏移地址的名定义了一个字符串“This is a sample program.” 和三个字符,其中0DH是CR(即回车)的ASCII码,0AH是LF(即换行)的ASCII码,$是 后续显示字符串功能的结束字符串标志。
应写
码
参数
调号
从
从
过结
义结
汇编
结
输写
二、实验思考的回答
1. 汇编程序的任务是什么?汇编程序对源文件进行两遍扫视的过程是什么? 答:汇编程序的任务是把汇编语言源程序模块转换为二进制的目标模块,其汇
编过程包括语法检查并指出错误(如非法格式,未定义符号等),能按用户要求自 动分配存储区(程序区、数据区、堆栈区),自动把各种进制数转换成二进制数, 以及计算表达式值等,以最终生成目标目标文件和辅助信息文件(即列表文件和交 叉引用文件)。
由于物理零地址区是由系统占用的,因而用户程序的各段都起始于某个非零 地址。亦即段起始地址要在零地址的基础上“浮动”一个值,而此值要在连接时才 能确定。所以变量和标号都是浮动地址,如果指令的操作数字段涉及到变量或标 号,那么由汇编程序确定的指令字中的值即为浮动值,此即所谓的“浮动地址”。
在LST文件中,浮动地址以R标记(Relocation)。 事实上就一个程序模块本身来说,“浮动地址”并无实质影响。若是出现多个 程序模块相连接的情况,当连接程序把几个模块中的某些段连接在一起形成一个 段时,地址的浮动就会直接影响机器指令代码,此时连接程序就非常有必要或说 是必须要修改各个模块程序中标以R的地址值,以得到正确的机器指令。 3.指令的物理地址是如何构成的? 答:指令的物理地址是在连接过程中确定的。 连接程序LINK把目标模块OBJ文件(一个或多个)中的各段连接成一个整体即 “EXE文件”。汇编得到的OBJ文件虽然已是源程序对应的二进制机器码,但该文件 不能直接运行,因为OBJ文件中的各段是独立的,它们的起始地址均被设为0,各 段没有形成一个整体。这就需要连接程序LINK来将OBJ文件中的各段连接成一个整 体即“EXE文件”。
MOV AX,STACK
MOV SS,AX 是将STACK段基址送给SS,之所以分为两步是因为不能在两个段寄存器之间直接传 送数据,接下来的PUSH DS是将DS的值放到栈中暂时保存下来,因为下面字符串输 出的时候需要改变DS的值,下面两行代码
MOV AX,0 PUSH AX 将0000H压入栈中,这是因为在子过程结束后,执行RET返回命令后,因为是远调用, 会先从栈中弹出两个字节为IP赋值,然后弹出两个字节为CS赋值以便返回主程序。 我们知道,在AH=9时,INT21的功能是显示字符串,串地址为DS:DX,‘$’为结束符。 所以下面的四行代码
STACK中定义了一个栈,这个栈内定义了100个字节的空间,但是没有放入具体 内容。
CODE中定义了一个MAIN过程,MAIN过程中的FAR说明了是段间调用,ASSUME指明 了段寄存器与段基址的对应关系。在此处即为CS对应CODE,DS对应DATA,SS对应 STACK。START标志着汇编程序的一个标号,定义了程序的入口。接着的两行代码
MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX ,OFFSET DA1 是在为字符串输出做准备。将字符串段地址DATA赋值给DS,字符串偏移地址DA1赋 值给DX,9赋值给AH,则执行INT 21H时,字符串“This is a sample program.”和回 车就显示在DOS界面上。RET返回原地址,MAIN EDNP表示MAIN过程结束。CODE ENDS 表示CODE段结束。END START表示汇编源程序结束。 1.2 程序的流程图
一、实验内容和过程
注:由于实验内容有两个题目,为了写实验报告时思路的连贯性,对于实验内容和过程两个题目分开写。
1.0 实验内容原题 1.请先充分分析和理解课件的源程序,然后输入、编辑该程序,并完成对其汇编、连
接、运行等操作过程。再用调试程序debug来查看、记录(建议使用表格形式)和分析 CS、IP、DS、ES、SS、SP以及AX、DX等程序中所使用到的和自己感兴趣的寄存器(例 如标志寄存器),在该程序执行前、执行过程、执行结束(出现有“Program terminated normally”提示信息)返回DOS等各个步骤的状态值,亲历查验程序运行的各个环节的 状态(包括查看数据段、堆栈段的存储内容),全面分析和充分理解汇编语言源程序 的组成,以及DOS系统平台调用执行程序的过程(包括返回DOS状态的操作原理)。
例如汇编程序MASM在翻译"JMP NEXT"指令时,若NEXT未定义(前向引 用),MASM不知道NEXT与JMP的距离,此时,MASM默认其缺省属性NEAR而假定它们 在同一段,且假定其距离大于-128~+127。 但是MASM的假定有时不符合程序的实 际情况,则将会产生错误的机器码,为了避免这种情况,在编写程序时,如果有前向引 用,应指明引用的属性(距离)。
2.2 程序的流程图
开始
输出提示语:“Please input a small word:”
输入小写字母
将其 ASCII 码减 32
输入小写字母
输出大写字母
结束
图二:程序二流程图
2.3 程序的清单(源程序)
数
数区输
车
换
结 标识
栈
栈区
节
码 远调 过
栈区 栈
为时 值
栈为时值
数区
数区
调号
输
调号
从键盘获 写
汇编程序把源程序文件转换为目标文件的过程需要对源文件进行两遍扫视。 第一遍扫视(PASS1)要处理伪指令,确定源程序每一行的偏移地址,扫视后应提供 一张符号表(或称标识符表),它把源程序所定义符号的偏移地址记录下来。其主要 任务是 (1)语法检查 (2)确定每一行源程序的段内偏移地址,并记录员程序定义的符号的偏移地 址,形成一张“符号表”。
母的个数和转换方式。
* 类同第1题的要求,使用调试程序debug来分析自编的该程序
2.1 程序的算法思想
a.本题中所做程序主要功能是在DOS界面显示说明语句:“Please input a smaFra Baidu bibliotekl word:”并且将一个从键盘输入的小写字母转换成大写字母显示在DOS界面。
b.程序中定义了三个段:DATA、STACK和CODE。
DATA段定义了一个字符串Please input a small word。
STACK段定义了一个长度为100字节的栈。
CODE为代码段。其中包含一个远调用过程MAIN,其段寄存器与段基址的对应关系为 CS:CODE,DS:DATA,SS:STACK。START开始之后开始第一条可执行语句。这一部分的 主要功能是将DS的段基址和0000H压入栈,将DS:DX赋值为DATA:DA1,使用9号DOS功 能输出字符串:“Please input a small word:”,使用1号DOS功能从键盘获得 一个小写字母,将其ASCII码减32得到相应的大写字母的ASCII码,并利用2号DOS功 能输出到DOS界面。过程结束前,用RET返回主程序,然后依次结束过程,结束CODE 段定义,结束汇编源程序。
值; 3)确定所有汇编程序所不能确定的偏移地址值(包括浮动地址及外部符号所
对应的地址); 4)构成装入模块,并把它装入存储器 5.使用Debug进行程序调试有哪些收获? 答: DEBUG在程序调试的过程中有强大的功能,由于其功能的全面,可以方便地分 步对代码进行调整,可以清楚地看到每一步寄存器以及标志位的状态。例如-D,R,-G,-T,-U都是本次实验过程中常用的调试功能。如果汇编程序存在问题的话,能 非常方便快捷地找到汇编程序的问题所在。由于本次试验较为简单,所以并没有用 其来发现一些错误,只是利用debug的功能更深入的对程序运行过程进行了了解。 而关于利用debug来发现问题,解决问题的技巧等方面,还需后续做了更多的实验 再来总结。
本次实验是微机原理这门课的第一次上机实验,上机之前就比较激动,因为本身也 是特别喜欢这门课,终于可以把学到的知识通过实践来自己操作。而实验课上,老师的 风趣幽默和博闻强识更加深了我对上机课的喜爱。因此,实验课结束后更激动。
在本节实验课上,我课前认真预习实验讲义,在上机实验课上熟悉了汇编语言程序 设计上机实验的计算机软硬件平台,熟悉了汇编语言程序设计上机实验的过程,掌握了 汇编语言源程序的编辑及对其汇编、连接、运行的过程,并且学会了使用DEBUG调试 和运行程序的方法。并且自己写了一个汇编的小程序,非常有成就感。
非常期待下一次的实验课。谢谢老师!
连接程序LINK对所有OBJ模块扫描两遍。 第一遍扫描对所有段分配段地址,并建立一张“外部符号表”(又称“全局符号 表”),记录外部符号(相对自身模块而言,在另外源程序模块中定义的标号、过程 名、变量名等符号)的地址和属性。 第二遍扫描确定与外部符号有关的机器指令,并创建“文件头”文件头包含操 作系统把EXE文件从磁盘调入内存所需的信息)。 由此所有指令的物理地址就被确定。 4.连接程序的主要工作是什么? 答:1)找到要连接的所有目标模块; 2)为所有要连接的目标模块中的所有段分配存储单元,即确定所有段地址
实验一 汇编语言程序设计上机实验的基本过程
——PB14000521 王艳红
〇、实验目的和要求:
1.熟悉汇编语言程序设计上机实验的计算机软硬件平台。 2.熟悉汇编语言程序设计上机实验的过程。 3.熟练掌握汇编语言源程序的编辑及对其汇编、连接、运行的过程。 4.熟练掌握使用DEBUG调试和运行程序的方法(“工欲善其事,必先利其器!“)。
在此过程中遇到的两个还没解决的小问题是关于DOSBox窗口的问题,第一是怎么能 将DOSBox窗口放大而字体不放大,第二是怎样可以实现DOSBox窗口中的翻页问题。问题 一是因为实验中确实觉得窗口太小用着不舒服,在网上找了一些方法也试了一下,但是 大多都是在将窗口放大的同事将字体也放大了。问题二是因为在DEBUG的过程中,有时 候想要上下对比但是并不能翻页看到前一页的内容所以很苦恼,希望能在老师的帮助下 得到解决。
图三:第一遍扫视主要流程
第二遍扫视(PASS2)产生机器指令代码、确定数据等,产生相应的 OBJ、LST 和 CREF 文件。
图四:第二遍扫视主要流程
2. 如何解决变量和标号的“向前引用”问题?地址“浮动”意味着什么? 答:在汇编语言的操作数字段中出现变量或标号时,若该变量或符号尚未定义,
则称为“前向引用”。 因为指令长度与操作数类型有关,而操作数类型则与有关变 量或标号的类型有关。在向后引用时,这些都是确定值,但向前引用时就会发生困 难了。
屏幕显示输出单个字符使用2号DOS功能调用,入口参数送DL寄存器。
(本题的目的就是让上机实验者亲历使用和体验一下DOS功能调用,来为下一次的实验热
身。)
要求: * 在程序运行时,先输入的小写字母在随后“自动”显示大写字母时仍在屏幕上。
* 至少能正确实现一个英文字母大小写的转换且能正常返回DOS即可,而不论转换字
开始
打印 DATA:DA1 处的字符串
结束
图一:程序一流程图
1.3 程序的清单(源程序)
数
数区
车
换
栈
栈区
节
结 标识
码 远调 过
栈区
栈
为时 值
栈为
值
数区
数区
调号
输
从
过结
义结
汇编
结
2.0 实验内容原题
2.请编写一个汇编源程序,实现从键盘输入的小写字母用大写字母在屏幕上显示出来。
提示:键盘输入单个字符并回显使用1号DOS功能调用,出口参数在AL寄存器。
1.1 程序的算法思想
a.例题中程序的主要功能是在DOS界面输出字符串“This is a sample program.”, 并自动换行。
b.程序中定义了三个段DATA、STACK和CODE。
DATA中以DA1为偏移地址的名定义了一个字符串“This is a sample program.” 和三个字符,其中0DH是CR(即回车)的ASCII码,0AH是LF(即换行)的ASCII码,$是 后续显示字符串功能的结束字符串标志。
应写
码
参数
调号
从
从
过结
义结
汇编
结
输写
二、实验思考的回答
1. 汇编程序的任务是什么?汇编程序对源文件进行两遍扫视的过程是什么? 答:汇编程序的任务是把汇编语言源程序模块转换为二进制的目标模块,其汇
编过程包括语法检查并指出错误(如非法格式,未定义符号等),能按用户要求自 动分配存储区(程序区、数据区、堆栈区),自动把各种进制数转换成二进制数, 以及计算表达式值等,以最终生成目标目标文件和辅助信息文件(即列表文件和交 叉引用文件)。
由于物理零地址区是由系统占用的,因而用户程序的各段都起始于某个非零 地址。亦即段起始地址要在零地址的基础上“浮动”一个值,而此值要在连接时才 能确定。所以变量和标号都是浮动地址,如果指令的操作数字段涉及到变量或标 号,那么由汇编程序确定的指令字中的值即为浮动值,此即所谓的“浮动地址”。
在LST文件中,浮动地址以R标记(Relocation)。 事实上就一个程序模块本身来说,“浮动地址”并无实质影响。若是出现多个 程序模块相连接的情况,当连接程序把几个模块中的某些段连接在一起形成一个 段时,地址的浮动就会直接影响机器指令代码,此时连接程序就非常有必要或说 是必须要修改各个模块程序中标以R的地址值,以得到正确的机器指令。 3.指令的物理地址是如何构成的? 答:指令的物理地址是在连接过程中确定的。 连接程序LINK把目标模块OBJ文件(一个或多个)中的各段连接成一个整体即 “EXE文件”。汇编得到的OBJ文件虽然已是源程序对应的二进制机器码,但该文件 不能直接运行,因为OBJ文件中的各段是独立的,它们的起始地址均被设为0,各 段没有形成一个整体。这就需要连接程序LINK来将OBJ文件中的各段连接成一个整 体即“EXE文件”。
MOV AX,STACK
MOV SS,AX 是将STACK段基址送给SS,之所以分为两步是因为不能在两个段寄存器之间直接传 送数据,接下来的PUSH DS是将DS的值放到栈中暂时保存下来,因为下面字符串输 出的时候需要改变DS的值,下面两行代码
MOV AX,0 PUSH AX 将0000H压入栈中,这是因为在子过程结束后,执行RET返回命令后,因为是远调用, 会先从栈中弹出两个字节为IP赋值,然后弹出两个字节为CS赋值以便返回主程序。 我们知道,在AH=9时,INT21的功能是显示字符串,串地址为DS:DX,‘$’为结束符。 所以下面的四行代码
STACK中定义了一个栈,这个栈内定义了100个字节的空间,但是没有放入具体 内容。
CODE中定义了一个MAIN过程,MAIN过程中的FAR说明了是段间调用,ASSUME指明 了段寄存器与段基址的对应关系。在此处即为CS对应CODE,DS对应DATA,SS对应 STACK。START标志着汇编程序的一个标号,定义了程序的入口。接着的两行代码
MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX ,OFFSET DA1 是在为字符串输出做准备。将字符串段地址DATA赋值给DS,字符串偏移地址DA1赋 值给DX,9赋值给AH,则执行INT 21H时,字符串“This is a sample program.”和回 车就显示在DOS界面上。RET返回原地址,MAIN EDNP表示MAIN过程结束。CODE ENDS 表示CODE段结束。END START表示汇编源程序结束。 1.2 程序的流程图
一、实验内容和过程
注:由于实验内容有两个题目,为了写实验报告时思路的连贯性,对于实验内容和过程两个题目分开写。
1.0 实验内容原题 1.请先充分分析和理解课件的源程序,然后输入、编辑该程序,并完成对其汇编、连
接、运行等操作过程。再用调试程序debug来查看、记录(建议使用表格形式)和分析 CS、IP、DS、ES、SS、SP以及AX、DX等程序中所使用到的和自己感兴趣的寄存器(例 如标志寄存器),在该程序执行前、执行过程、执行结束(出现有“Program terminated normally”提示信息)返回DOS等各个步骤的状态值,亲历查验程序运行的各个环节的 状态(包括查看数据段、堆栈段的存储内容),全面分析和充分理解汇编语言源程序 的组成,以及DOS系统平台调用执行程序的过程(包括返回DOS状态的操作原理)。
例如汇编程序MASM在翻译"JMP NEXT"指令时,若NEXT未定义(前向引 用),MASM不知道NEXT与JMP的距离,此时,MASM默认其缺省属性NEAR而假定它们 在同一段,且假定其距离大于-128~+127。 但是MASM的假定有时不符合程序的实 际情况,则将会产生错误的机器码,为了避免这种情况,在编写程序时,如果有前向引 用,应指明引用的属性(距离)。
2.2 程序的流程图
开始
输出提示语:“Please input a small word:”
输入小写字母
将其 ASCII 码减 32
输入小写字母
输出大写字母
结束
图二:程序二流程图
2.3 程序的清单(源程序)
数
数区输
车
换
结 标识
栈
栈区
节
码 远调 过
栈区 栈
为时 值
栈为时值
数区
数区
调号
输
调号
从键盘获 写
汇编程序把源程序文件转换为目标文件的过程需要对源文件进行两遍扫视。 第一遍扫视(PASS1)要处理伪指令,确定源程序每一行的偏移地址,扫视后应提供 一张符号表(或称标识符表),它把源程序所定义符号的偏移地址记录下来。其主要 任务是 (1)语法检查 (2)确定每一行源程序的段内偏移地址,并记录员程序定义的符号的偏移地 址,形成一张“符号表”。
母的个数和转换方式。
* 类同第1题的要求,使用调试程序debug来分析自编的该程序
2.1 程序的算法思想
a.本题中所做程序主要功能是在DOS界面显示说明语句:“Please input a smaFra Baidu bibliotekl word:”并且将一个从键盘输入的小写字母转换成大写字母显示在DOS界面。
b.程序中定义了三个段:DATA、STACK和CODE。
DATA段定义了一个字符串Please input a small word。
STACK段定义了一个长度为100字节的栈。
CODE为代码段。其中包含一个远调用过程MAIN,其段寄存器与段基址的对应关系为 CS:CODE,DS:DATA,SS:STACK。START开始之后开始第一条可执行语句。这一部分的 主要功能是将DS的段基址和0000H压入栈,将DS:DX赋值为DATA:DA1,使用9号DOS功 能输出字符串:“Please input a small word:”,使用1号DOS功能从键盘获得 一个小写字母,将其ASCII码减32得到相应的大写字母的ASCII码,并利用2号DOS功 能输出到DOS界面。过程结束前,用RET返回主程序,然后依次结束过程,结束CODE 段定义,结束汇编源程序。
值; 3)确定所有汇编程序所不能确定的偏移地址值(包括浮动地址及外部符号所
对应的地址); 4)构成装入模块,并把它装入存储器 5.使用Debug进行程序调试有哪些收获? 答: DEBUG在程序调试的过程中有强大的功能,由于其功能的全面,可以方便地分 步对代码进行调整,可以清楚地看到每一步寄存器以及标志位的状态。例如-D,R,-G,-T,-U都是本次实验过程中常用的调试功能。如果汇编程序存在问题的话,能 非常方便快捷地找到汇编程序的问题所在。由于本次试验较为简单,所以并没有用 其来发现一些错误,只是利用debug的功能更深入的对程序运行过程进行了了解。 而关于利用debug来发现问题,解决问题的技巧等方面,还需后续做了更多的实验 再来总结。