电科微机原理与接口试验自编教材Word文档下载推荐.docx
《电科微机原理与接口试验自编教材Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电科微机原理与接口试验自编教材Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
3.平时成绩占50%,上机考核占50%。
四、本实验课教材或实验指导参考书
[1]李东《微机原理与接口实验自编教材》
[2]《微机接口实验系统8086/8088实验指导书》启东达爱思计算机有限公司出品
[3]王智文、蔡启先等《微机原理及汇编语言程序设计》2005年10月
《微机原理与接口实验自编教材》
信息与计算科学系电科教研室李东
前言:
汇编语言程序设计是电子信息科学与技术专业的一门重要的计算机技术基础课程和必修的专业基础课,是操作系统、计算机接口技术、计算机系统结构、单片机原理、计算机控制技术等课程的先修课。
在众多的程序设计语言中,汇编语言是面向机器的低级语言。
由于汇编语言可以直接对硬件资源进行编程,因而汇编语言具有更高的执行效率。
与高级与语言相比,它更适合于对执行速度和代码长度要求较高的场合。
可见,汇编语言一方面可以帮助学生理解计算机工作原理,为后续课程的学习打下基础,同时也可以直接应用于实时控制及与硬件资源京密结合的其它领域。
汇编语言程序设计是一门实践性很强的课程,程序设计如何,是否达到要求,必须通过上机运行和调试。
在具体学习实践中,很多人普遍感到汇编语言程序改错、上机调试使学生操作上的难点,应此,我们编写了本实验教材,具有通俗易懂的特点,希望对大家的学习有所帮助。
《微机原理与接口技术实验》实验报告
系:
;
班级:
姓名:
学号:
指导教师:
李东;
实验时间:
实验成绩:
实验一调试程序DEBUG的使用
DEBUG.EXE是DOS提供的用于调试可执行程序的工具软件,是汇编语言程序设计中常用的调试工具。
在DEBUG环境下,不但可以调试经汇编、连接后生成的可执行程序,也可以编写简单的程序。
一、实验目的
1.熟悉debug常用命令的使用方法
2.了解上机操作环境
二、实验内容
1.按照提供的《debug》电子版补充教材进行学习训练
2.用汇编语言编写一个计算“3+5”的加法程序
3.利用debug运行简单的汇编程序。
4.熟悉debug常用命令的使用方法
三、实验实现的程序及上机操作步骤
MOVAL,33H;
将3的ASCII码送入AL寄存器中
MOVDL,35H;
将5的ASCII码送入DL寄存器中
ADDDL,AL;
做“3+5”,结果送DL寄存器
SUBDL,30H;
将“3+5”的结果进行调整,得到8的ASCII码,送DL寄存器
MOVAH,2;
INT21H;
输出DL寄存器中的字符
INT20H;
中断当前执行的程序
该程序是将两个十进制数3和5的ASCII码送入寄存器AL和DL,当ASCII码进行相加时必须通过条调整后才能得到其结果。
如例中,33H+35H等于68H,68H-30H=38H,38H才是十进制8的ASCII码,再将结果在显示器上显示DL寄存器中的字符,该字符应该是将字符的ASCII码放在DL寄存器中。
INT20H是中断正常结束程序。
运行步骤如下:
1.进入DEBUG状态
点击“开始”→“程序”→“附件”→“命令提示符”,进入DOS操作环境。
然后运行DEBUG程序:
(说明:
本课程实验假设是在c盘上建立了masm子目录,且masm.exe、link.exe、debug.exe、cref.exe、lib.exe都在该目录中。
)
C:
\﹍\﹍>
CD\↙
\>
CDMASM↙
MASM>
DEBUG↙
屏幕显示:
_
“_”为已进入DEBUG状态,在该提示符下可键入DEBUG命令。
(下划线部分表示用户键入的字符或命令,↙为回车符号)
2.键入程序并汇编
用DEBUG的A命令送入程序:
_A100↙
0A47:
0100MOVAL,33↙
0102MOVDL,35↙
0104ADDDL,AL↙
0106SUBDL,30↙
0109MOVAH,2↙
010BINT21↙
010DINT20↙
010F↙
_
当键入A命令时,自动产生程序所送内存单元的段地址和偏移地址。
通过偏移地址可以看到每条指令占内存单元多少字节。
如“MOVAL,33”占两个字节,·
·
当程序送完时,只键入回车键↙,就退出汇编状态(A状态)回到DEBUG状态“-”。
其中送入的数据为十六进制数,DEBUG状态下程序中的数据均按十六进制处理,不需要键入H来表示数据为十六进制数。
3.执行程序
用DEBUG的G命令执行刚刚汇编的程序:
-G↙
programterminatednormally
4.反汇编
可以用反汇编U命令将键入的程序调出,并且可以得到每条汇编指令的机器码。
-U10010D↙
0100BO33MOVAL,33
0102B235MOVDL,35
010400C2ADDDL,AL
010680EA30SUBDL,30
0109B402MOVAH,2
010BCD21INT21
010DCD20INT20
四、熟悉:
E、D、R等其它debug常用命令
例:
利用DEBUG的E命令向内存中写入机器码,D命令察看内存中的数据,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码。
如何向内存中写入机器码呢?
我们知道,机器码也是数据,当然也可以用E命令将机器码写入内存。
比如要从内存1000:
0单元开始写入这样一段机器码:
机器码对应的汇编指令
b80100movax,0001
b90200movcx,0002
01c2addax,cx
可以用下述的方法进行实验:
\>
-E1000:
0B80100B9020001C8↙
-
如何查看我们写入的或内存中原有的汇编指令呢?
我们用D命令察看1000:
0~1000:
1F中的数据(从数据的角度看一下我们写入的内容);
最后用U命令将1000:
0开始的内存单元中的机器指令代码翻译成他们所对应的汇编指令。
-U1000:
01F↙
1000:
0000B80100MOVAX,0001
0003B90200MOVCX,0002
000601C8ADDAX,CX
0008·
由此,我们可以再一次看到内存中的数据和代码没有任何区别,关键在于如何解释。
如何执行我们写入的机器指令呢?
使用DEBUG的T命令可以执行一条或多条指令,简单的使用T命令,可以执行CS:
IP指向的指令:
接前面实验:
-R↙
·
-RCS↙
CSXXXX
:
1000↙
-RIP↙
IPXXXX
0↙
-R↙
-T↙
-P↙
这个例子中,我们先用E命令向1000:
0开始的内存单元中写入了8个字节的机器码,然后用R命令查看CPU中寄存器的状态,可以看到,CS=XXXX,IP=YYYY,指向内存XXXX:
YYYY;
若要用T命令控制CPU执行我们写到1000:
0的指令,必须先让CS:
IP指向1000:
0;
接着用R命令修改CS、IP中的内容,使CS:
完成上面的步骤后,我们就可以使用T命令来执行我们写入的指令了(此时CS:
IP指向我们的指令所在的内存单元)。
执行T命令后,CPU执行CS:
IP指向的指令,则1000:
0处的指令B80100(MOVAX,0001)得到执行。
指令执行后,DEBUG显示输出CPU中寄存器的状态。
注意:
指令执行后,AX中的内容改写为1,IP改写为IP+3(因为(MOVAX,0001的指令长度为3个字节),CS:
IP指向下一条指令。
接着我们可以继续使用T命令执行下面的指令,注意每条指令执行后,CPU相关寄存器内容的变化。
五、实验运行结果及实验后的心得体会
实验二汇编语言程序的编辑、汇编、链接、调试、运行
1.了解上机操作环境;
2.了解上机操作流程;
3.熟悉EDIT编辑程序的使用方法,利用EDIT编辑简单的汇编程序;
4.熟悉汇编语言程序的编辑、汇编、链接、调试、运行
二、本实验上机操作环境:
这里列出了本实验的上机操作环境。
包括:
操作系统:
Window9x的MS-DOS方式,MSDOS6.22、MSDOS7.0,Window2000及以上“命令提示符”的运行等。
文本编辑器:
记事本,EDIT.COM等
汇编程序:
MASM.EXE、ASM.EXE等
连接程序:
LINK.EXE
调试程序:
DEBUG.EXE
此外还有:
索引程序:
CREF.EXE
库管理程序:
LIB.EXE
假定在C盘上建立了MASM子目录,且上述程序都在该目录中。
三、上机操作流程
整个上机过程包括:
①建立与编辑源程序;
②原程序汇编产生目标文件;
③连接目标程序产生可执行程序;
④调试运行可执行程序这么四个步骤。
①进入MS-DOS,建立与编辑源程序
点击“开始”→“程序”→“附件”→“命令提示符”,进入DOS操作环境:
CD\MASM↙
DIR↙
C:
MASMXX-XX<
DIR>
的目录
200X-XX-XXXX-XX<
200X-XX-XX
200X-XX-XXXX-XX39,100MASM.EXE
200X-XX-XXXX-XX39,100LINK.EXE
200X-XX-XXXX-XX39,100CREF.EXE
200X-XX-XXXX-XX39,100LIB.EXE
200X-XX-XXXX-XX39,100DEBUG.EXE
XX个文件XXX,XXX字节
X个目录X,XXX,XXX,XXX可用字节
现在我们利用EDIT编辑程序:
MASM>
EDIT↙
进入EDIT编辑状态,在EDIT文本编辑器中输入源程序:
DATASEGMENT
XDB0E5H;
定义变量X、Y、W
YDB34H
WDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;
装填DS端地址
MOVDS,AX
XORAH,AH;
AH清零,为高字节加作准备
MOVAL,X;
AX=X+Y
ADDAL,Y
ADCAH,0
MOVW,AX;
送结果
MOVAH,4CH;
返回DOS
INT21H
CODEENDS
ENDSTART
程序输入完毕,要给输入的程序起一个文件名,其扩展名必须为.ASM。
按下ALT健,在file菜单中用方向健选择“save”,再出现的对话框中的“filename:
[--------]”中输入“test1.asm”并即点击ok或按回车。
按下ALT健,在file菜单中用方向健选择“Exit”并退出EDIT回到DOS状态。
②原程序汇编产生目标文件
\MASM>
MASMTEST1.ASM↙
Microsost(R)MacroAssemblerVersion5.00
Copyright(C)MicrosostCorp1981-1985,1987
Sourcefilename[.ASM]:
TEST1↙
Objectfilename[TEST1.ASM]:
↙
Sourcelisting[NUL.LST]:
50722+410046Bytesymbolspacefree
0WarningErrors
0SevereErrors
汇编成功,形成TEST1.OBJ文件。
若不需要列表文件和交叉索引文件可直接回车跳过。
③连接目标程序产生可执行程序
LINKTEST1↙
IBMPersonalComputerLinker
Version2.00(C)CopyrightIBMCorp1985、1986、2000
ObjectModules[.OBJ]:
RunFile[TEST1.EXE]:
↙
ListFile[NUL.MAP]:
Libraries[.LIB]:
Warning:
NoStsckSegment
(表明用户程序没有设置堆栈,将由系统自动设置,此警告错误一般不会影响可执行程序的产生和运行。
)下面我们进行程序的运行与结果检查:
④.调试运行可执行程序
TEST1.EXE↙;
执行该程序
由于程序执行的结果存放在内存单元中,因而屏幕看不到任何结果。
因此,必须启动DEBUG调试程序,来了解运行的结果。
DEBUG↙
屏幕显示“-”号是DEBUG系统提示符。
-NTEST1.EXE↙;
用N命令来指定要调试的文件名
-L↙;
用L命令装入该文件到内存中
-U↙;
用U命令反汇编该文件
1407:
0000B80614MOVAX,1406
0000B80614MOVDS,AX
-D1406:
0,F↙
1406:
0000E534000000000000-0000000000000000
说明按照程序的DATA数据段的要求它排了变量X的数据E5H和Y的数据34H,接下来使用G命令执行程序:
-G=1407:
0↙;
该命令表示要执行地址为1407:
0开始的程序
Programterminatednormally
-D1406:
0,F↙;
查看结果
0000E534190100000000-0000000000000000
(可见W的值为0119H,结果是正确的)
-Q↙;
退出DEBUG
下面介绍DEBUG另一种启动方法:
DEBUGTEST1.EXE↙;
将指定文件装入内存
-U↙
13C8:
0000B8C713MOVAX,13C7
00008ED8MOVDS,AX
-D13C7:
0000,F↙
13C7:
0000E534000000000000-0000000000000000
下面用单步调试来运行调试程序:
所谓单步调试,是指逐条执行程序指令,每执行完当前一条指令后,系统会暂停,此时用户可以用D命令来查看内存,或用R命令查看寄存器内容,从而了解程序是否按设计要求正常运行,再用DEBUG将.EXE程序装入并用U命令反汇编了解有关信息后,执行程序时不用G命令而用T命令。
下面以TEST1.EXE程序为例:
-T=13C7:
0↙
此时屏幕显示各个寄存器内容及下一条要执行的指令,依次使用T命令就可以观察每一条指令执行后的寄存器,内存的具体情况:
AX=13C3BX=XXDX=XX·
13C4:
00038ED8MOVDS,AX
- T↙
0014B44CMOVAH,4C
说明遇到子程序、中断程序、循环程序时,没有必要跟踪下去。
下面用P命令来避免(把它当作一条指令来执行)
- P↙
或者用G命令一直运行到程序结束(或断点处)
- G↙
-
四、实验后的心得体会
实验三顺序结构程序设计
掌握8086/8088汇编语言程序设计和调试方法。
本实验应用顺序结构程序设计方法,上机编程调试汇编语言程序。
设A、B、C、均为无符号字节数据,编程求Y=(A+B)×
C的值。
(A+B)×
C
三、程序流程
分析:
由题意知,A、B、C均为无符号字节数据,其值在0~255范围内,A+B的值有可能超过8位的字节范围,即在字范围之内。
因此,产生的和与C相乘时,应选择16位相乘指令。
按A、B、C、均为最大数(255)分析,乘积有可能超过16位,在双字的范围内。
从题意可分析应按“顺序结构”设计程序。
四、实验步骤
用连续或单步方式运行程序,检查Y变量地址中的结果是否正确。
五、实验思考
六、实验参考程序
方法1:
ADB201
BDB174
CDB240
YDW?
?
;
-----------------------------------------------------
MOVAX,DATA
MOVDS,AX;
为数据段寄存器装入值
MOVAH,0
MOVAL,A;
取变量A的值
ADDAL,B;
求变量A与B的8位之和
ADCAH,0;
产生的进位送入AH,16位的和在AX中
MOVBL,C
MOVBH,0;
变量C的值取入BX寄存器
MULBX;
DX,AX←和×
MOVY,AX;
送32位积的低字位
MOVY+2,DX;
送32位积的高字位
MOVAH,4CH
INT21H;
返回DOS状态
方法2:
NUMDB201,174,240
MOVSI,OFFSETNUM;
设地址指针
MOVBH,AH;
AX和BX的高8位清零
MOVAL,[SI];
数据A、B、C都是DB定义的字节数据
MOVBL,[SI+1];
因此它们的值只能取入8位寄存器
ADDAX,BX;
AL←A+B,AH←若有进位
MOVBL,[SI+2];
取数据C的值到BL
实验四 分支机构程序设计
本实验应用分支结构程序设计方法,上机编程调试汇编语言程序。
设X为字节变量,其值在DS:
0400H单元存放,Y的值存于0041H单元中,编程求下面的函数值,并画出程序流程图:
1(X>
0)
Y=0(X=0)
-1(X<
分析:
依题意知这是三分支程序,因此在程序中应判断两次,根据变量X值的大小,决定函数Y的值。
程序流程图如下所示:
六、实验程序
编程:
数据段程序中为字节变量X定义一个-128~+127范围内的任一值,为函数Y保留一个字节单元,存放Y的值。
参考程序如下:
ORG0040H
ADB-27
BDB?
取字节变量X的值
ANDAL,AL;
影响出SF和ZF标志位的状态
JSM1
JZM2
MOVB,1;
若结果为正,Y值取+1
JMPDONE
M1:
MOVB,-1;
若结果为负,Y值取-
M2:
MOVB,0;
若结果为0,Y值取0
DONE:
MOVAH,4CH
实验五循环结构程序设计
本实验应用循环结构程序设计方法,上机编程调试汇编语言程序。
已知内存DS:
0010H~0031H单元中存放的是带符号的字节数据,编程求