微机原理上机指导书.docx
《微机原理上机指导书.docx》由会员分享,可在线阅读,更多相关《微机原理上机指导书.docx(55页珍藏版)》请在冰豆网上搜索。
微机原理上机指导书
姓名:
_________________
学号:
_________________
专业:
_________________
日期:
_________________
目录
目录1
实验1DEBUG命令的应用2
实验2汇编语言程序上机过程12
实验3分支程序实验15
实验4循环程序实验18
实验5子程序实验19
实验6字符处理程序实验23
实验7排序程序设计27
实验8计算机钢琴程序29
实验9键盘和窗口程序31
实验10磁盘文件操作程序34
实验1DEBUG命令的应用
一、实验目的
1.学会DEBUG调试程序的命令应用;
2.观察各通用寄存器、标志寄存器和存储器的变化情况;
3.加深对汇编语言指令的理解。
二、实验设备和仪器
1.计算机
2.windowsXP操作系统
3.Win-Masm汇编软件
三、实验内容及要求
要求学会使用DEBUG常用命令,并熟悉8086常用指令的使用。
调试一段程序,使用DEBUG进行相应的操作。
1.DEBUG介绍
DEBUG调试程序是以DOS外部命令程序的形式提供的,它的文件名是DEBUG.COM。
DEBUG的命令是具有规定格式的特殊字符串。
命令是单个字母,通常后面还有1个或1个以上的参数。
DEBUG支持基本的8086/8088汇编语言语法,DEBUG下的汇编语言有下面一些特点和规则:
(1)数值都是十六进制数,并且不加尾缀“H”。
(2)不能使用符号常量和符号地址。
(3)不能使用绝大部分伪指令,但两个最常用的伪指令DB和DW能被使用,用于直接把字节和字数据置人相应存储单元。
如:
DB1,2,3,4,“ABCD”
DW1234,5678
(4)可以使用属性操作符“PTR”对DEBUG不能明确类型的操作数进行说明。
如:
INCBYTEPTR[BX]。
(5)DEBUG的A命令汇编程序能根据转移目标地址的距离自动地汇编出短、近或远的转移或调用指令。
当然,这也能由“SHORT”、“NEARPTR”或"FARPTR”对转移目标地址进行说明来实现。
(6)远返回指令的助记符在DEBUG中为RETF。
(7)指令前缀助记符必须在相关的指令之前输入,也可以分别放在不同的行。
(8)串操作指令只能用其字节型或字型的助记符形式,如:
MOVSB、CMPSW等。
(9)可以使用段超越前缀助记符CS:
、DS:
、ES:
和SS:
。
DEBUG常用命令如下:
(1)汇编命令(Assemble)
用途:
键人汇编指令,并把它们汇编成机器代码,相继存放在从指定地址开始的存储区中。
格式:
A[address]
说明:
输入给本命令的所有数字都是十六进制的。
将输人的指令从指定的地址address开始装入内存的连续单元。
如果不指定地址,则把语句装人CS:
0100确定的区域中;如果已用过A命令,那么就在前一个A命令所装入的最后一条指令的后继单元中,接着输入指令。
当所有要求的指令已输人完成,在提示继续输人下一条指令时,直接按ENTER就退回DEBUG提示符下。
DEBUG对不可用语句的响应是显示信息:
∧
error
并显示当前的装人地址。
(2)显示内存命令(Dump)
用途:
显示存储器的内容。
格式:
D[address][address]
或者D[address][range]
说明:
第一种格式的地址为待显示内存单元的首地址和末地址。
第二种格式表示显示从地址address开始、长度为range范围的内存单元。
①十六进制部分。
用十六进制显示每个字节。
②ASCII部分。
把字节显示成ASCII字符。
句点“.”表示非显示打印的字符。
(3)修改内存命令(Enter)
用途:
该命令有两种工作方式:
用清单中包含的值替换从指定地址开始的一个或一个以上的字节内容;显示和允许顺序方式修改字节。
格式:
Eaddress(list)
说明:
如果只输入偏移值作为地址,那么E命令认为是包含在DS寄存器内的那个段。
(4)执行命令(GO)
用途:
执行正在调试的程序。
当达到所指定的断点地址处时,就停止执行,并显示寄存器、标志位以及下一条要执行的指令。
格式:
G[=address][address[address∙∙∙]]
说明:
第一个参数=address,规定了执行的起始地址,即以CS的内容为段地址,以等号后面的地址为偏移地址,在输入时,等号是不可缺少的,若不输入起始地址,则以CS:
IP为起始地址,后面的地址参数是断点地址。
如果在G命令中没有设置断点,或设有断点但程序在执行中未能到达断点处,这时程序将一直运行,直至结束。
在结束时显示提示信息“Programterminatednormally"。
在G命令中可以设置断点,格式为G=0000000D
13FE:
000D8B07MOVAX,[BX]
13FE:
000FB8004CMOVAX,4C00
13FE:
0012CD21INT21
AX=1323BX=0000CX=0034DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13FCES=13ECSS=13FCCS=13FEIP=000ANVUPEIPLNZNAPONC
13FE:
000ABB1A00MOVBX,001A
-可以看到AL中的数为23
(5)退出命令(Quit),
用途:
结束DEBUG程序。
格式:
Q
说明:
Q命令不保存内存中正工作的文件,需要时可用Write命令保存文件。
(6)寄存器命令(Register)
用途:
寄存器命令有三种功能:
①显示单个寄存器的十六进制内容,并带有修改这些内容的选择。
②显示全部寄存器、标志位、以及将被执行的下条指令。
③显示8个标志位状态,并带有修改它们之中任一个或全部的选择。
格式:
R[registename]
使用说明:
①显示单个寄存器
有效寄存器是:
AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS和IP。
例如,为了显示AX寄存器的内容,可输入:
RAX
系统显示如下:
AXF1E4
:
_
现在可以采用下列两个操作中的某一个:
a.按ENTER键保留未修改的内容。
b.输入1—4字符的十六进制值来修改AX寄存器的内容,例如FFFH,
AXF1F4
:
FFF_
现在按ENTER键把AX寄存器内容改变成0FFFH。
②显示所有的寄存器和标志位
为了显示所有寄存器的内容和标志位(还有下条要执行的指令),输入:
R
则系统可能显示如下:
AX=0E00BX=00FFCX=0007DX=01FF
SP=039DBP=0000SI=005CDI=0000
DS=04BAES=04BASS=04BACS=04BA
IP=011ANVUPDINGNZACPENC
04BA:
01lACD211NT21
头4行显示寄存器十六进制内容和8个标志位状态。
最后一行指出下一条要执行的指令地址和它的16进制机器码以及反汇编形式,这是当前CS:
IP指向的指令。
③显示标志位
有8个标志位,每位用2个字母表示是置“1”状态还是清除状态,详细说明见下表:
标志位的符号表示
标志位名称
Set(置位)
clear(清除)
溢出(是/否)
方向(减/增)
中断(允许/禁止)
符号(负/正)
零(是/否)
辅助进位(是/否)
奇偶(偶/奇)
进位(是/否)
OV
DN
EI
NG
ZR
AC
PE
CY
NV
UP
DI
PL
NZ
NA
PO
NC
为了显示所有的标志位,输人命令:
RF
如果所有标志位处于置1状态,就显示:
OVDNEINGZRACPECY—
现在可以进行下面两个操作之中的某一个:
a.按ENTER键保留未修改的标志位状态。
b.修改任一个或全部标志位状态。
为了修改标志位,应输入它的相反码。
可以按任何顺序,带或不带分隔的空格来输入此相反码。
例如,为了修改第一、第三、第五和第七标志位,输入:
0VDNEINGZRACPECY_PONZDINV
上面是按倒过来的顺序输入标志码的。
按ENTER键则按所指定的要求修改各标志位。
如果想验证新的码是否有效,就输人:
RF
显示将是
NVDNDINCNZACPOCY—
可见除第二、第四、第六和第八标志位不变外,其它各位已按要求修改了。
(7)跟踪命令(Trace)
用途:
从CS:
IP或者=address(如果指定的话)单元中的指令开始单步执行一条或多条指令。
这里的=号必须输入。
可以用value指定跟踪多条指令。
每条指令执行后,显示所有寄存器的内容、标志位的状态以及下一条要执行的指令。
格式:
T(=address)[value]
例如,输入命令:
T
如果IP寄存器内容为011A,而该地址指向的指令是MOVAH,0EH,这可能显示:
AX=0E00BX=00FFCX=0007DX=01FF
SP=039DBP=0000SI=005CD1=0000
DS=04BAES=04BASS=04BACS=04BA
IP=011CNVUPDINGNZNCPENC
04BA:
01lCCD21INT21
这是执行011A中指令之后显示的结果,并且指出下条要执行的指令是04BA:
011C单元中的INT21。
(8)反汇编命令(Unassemble)
用途:
反汇编命令可把内存中的机器码反汇编成8086/8088的汇编指令格式,并显示指令的地址、机器码以及汇编语句。
把目标代码反汇编后,用户可以方便地知道,程序从什么地址开始执行,执行的是哪一条指令,执行到什么地址为止。
例如:
04BA:
0100206472AND[SI+72],AH
04BA:
0103FCCLD
04BA:
01047665JBE016B
格式:
U[address]
或者U[Range]
反汇编命令有两种选择形式:
形式1——用于反汇编不带指定地址的指令,或反汇编从指定地址开始的指令
例如:
U
或者Uaddress
用40列显示时,一次把16个字节反汇编;用80列显示时,一次把32个字节反汇编。
若给出地址address,则从指定的地址开始把指令反汇编。
如果不指定地址,则U命令认为起始地址是原先U命令反汇编过的最后指令的下一个单元。
因此,连续地输入无参数的U命令能够对连续的内存单元进行反汇编,并产生连续的反汇编的显示。
如果原先没有输入U命令,则起始单元是由DEBUG初始化在代码中的段内偏移值01OOH。
形式2——用于把指定地址范围内的指令进行反汇编。
例如:
Urange
不管系统显示格式如何,把指定地址范围内的所有指令都进行反汇编。
例如,输入命令
U04ba:
0100108
显示可能是:
04BA:
0100206472AND[SI+72],AH
04BA:
0103FCCLD
04BA:
01047665JBE016B
04BA:
0106207370AND[BP+DI+70],DH
2.程序调试
1.用编辑软件,输入以下汇编语言源程序:
DATSEGMENT
ADB20;(自定)
BDB15;(自定)
YDB3DUP(0)
ZDB0,0
DATENDS
STASEGMENTSTACK
DW50DUP(?
)
STAENDS
CODSEGMENT
ASSUMECS:
COD,DS:
DAT
STARPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DAT
MOVDS,AX
MOVAX,STA
MOVSS,AX
MOVAL,A
MOVZ,AL
MOVZ+1,AL
CALLSUB1
MOVAL,B
MOVZ,AL
MOVZ+1,AL
CALLSUB1
MOVAL,A
MOVZ,AL
MOVAL,B
MOVZ+1,AL
CALLSUB1
ADDWORDPTRY,AX
ADCBYTEPTR[Y+2],0
RET
STARENDP
SUB1PROC
MOVAL,Z
MOVAH,Z+1
MULAH
ADDWORDPTRY,AX
ADCBYTEPTR[Y+2],0
RET
SUB1ENDP
CODENDS
ENDSTAR
2.仔细阅读程序,分析程序执行后数据段内的数据是什么。
3.通过编译,连接形成可执行文件;
4.用DEBUG将可执行文件调入,并进行调试;
(1)用U命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始位置,并记录这个起始地址;观察数据段的段地址DS;
(2)用D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址;
(3)用T命令作单步跟踪调试,比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:
它们写在什么单元,具体内容是什么,并判断结果是否正确;
(4)在子程序SUB1的入口处设一断点,用G命令执行程序,在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致;
(5)用E命令修改单元A、B的内容,重新执行程序,并记录结果;
(6)退出DEBUG;
(1)U命令对目标代码反汇编,注意发现源程序的起始位置,并记录这个起始地址。
答:
源程序起始地址:
1512:
0000H。
(2)D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址。
注意:
如何从上图得到数据段的段地址。
答:
150A:
0000H是A的具体地址,150A:
0001H是B的具体地址。
(3)T命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否一致。
得出程序运行的结果:
它们是写在什么单元,具体内容是什么,并判断结果是否正确。
答:
由于单步调试的结果较多,在这里仅说几项以示情况。
PUSHAX后观察得到IP值自加2。
MOVDS,AX后DS的值由14FAH变成150AH。
Z的偏移地址为0005H,而寻址Z中的内容成为[0005H]。
所以结果一致正确。
(4)在子程序SUB1的入口处设一断点,用G命令执行程序,在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致。
答:
SS=150BH,IP=0017H,和程序返回地址一致。
(5)用E命令修改单元A,B的内容,重新执行程序,并记录结果。
实验2汇编语言程序上机过程
一.实验目的
熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。
了解汇编语言程序的汇编、运行环境。
二.实验内容及要求
1.掌握伪指令:
SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;
2.利用INT21H的1号、2号、9号功能实现键盘输入、显示器输出的方法。
阅读参考程序1,写出剩余程序行的注释,并说明程序的功能,运行得到正确的显示结果。
3.将两个2字节长的二进制数相加,运算结果存放在相应结果单元中。
阅读参考程序2。
写出剩余程序行的注释,并说明程序的功能,运行得到正确的显示结果。
三.实验环境
PC微机
Windows操作系统
Win-Masm编译环境
四.实验步骤
1.打开Win-Masm——新建文件——将源程序输入——保存为扩展名*.ASM的文件(选择路径:
D:
\MASM\你的学号\......)——运行、编译链接(F8)、编译链接并运行(F9)——Debug调试(CTRL+D)进行检查。
2.汇编、连接及调试时产生的错误,找出原因及解决办法。
实验步骤:
1.打开Win-Masm——新建文件——将源程序输入——保存为扩展名*.ASM的文件(选择路径:
D:
\MASM\你的学号\......)——运行、编译链接(F8)、编译链接并运行(F9)——Debug调试(CTRL+D)进行检查。
2.汇编、连接及调试时产生的错误,找出原因及解决办法。
五.思考题
1.若被加数和加数各有三个字节,则依据参考程序2,编写程序得到正确结果。
参考程序1:
data segment ;定义数据段
messagedb'Thisisasampleprogramofkeyboardanddisply' ;定义message
db0dh,0ah,'Pleasestrikethekey!
',0dh,0ah,'$' ;光标自动换行
dataends
stacksegmentparastack'stack' ;定义堆栈段
db50dup(?
) ;分配50个字节空间,初值为任意值
stackends
code segment ;定义代码段
assume cs:
code,ds:
data,ss:
stack ;定义段寄存器
start:
movax,data
movds,ax ;将数据段的段地址送入DS
movdx,offsetmessage ;将message的偏移地址送DX
movah,9;功能号09送AH
int21h ;执行系统功能调用,将首单元偏移地址为AX的字符串输出到显示器
again:
mov ah,1;功能号01送AH
int21h ;执行系统功能调用,等待键盘输入,保存至AL
cmpal,1bh
jeexit
cmpal,61h
jc(jb)nd
cmpal,7ah
jand
andal,11011111b;
nd:
movdl,al
movah,2;功能号01送AH
int21h;执行系统功能调用,将AL内的字符输出到显示器
jmpagain
exit:
movah,4ch;调用返回DOS功能
int21h;返回到DOS
codeends
endstart
参考程序2:
DATASEGMENT
DATA1DB1,2;定义字节数据DATA1
DATA2DB5,6;定义字节数据DATA2
DATA3DB0,0;定义字节数据DATA3
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
CLC
MOVAL,DATA1[SI]
ADCAL,DATA2[SI]
MOVDATA3[SI],AL
INCSI
MOVAL,DATA1[SI]
ADCAL,DATA2[SI]
MOVDATA3[SI],AL
;..................
MOVBX,OFFSETDATA3
MOVDL,[BX]
ADDDL,30H
MOVAH,2
INT21H
INCBX
MOVDL,[BX]
ADDDL,30H
MOVAH,2
INT21H
;..................
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDSTART
实验3分支程序实验
一.实验目的
1.掌握分支程序的设计方法;
2.掌握利用DEBUG修改参数、检查结果的方法;
1.熟悉汇编语言源程序的编辑、汇编、连接及调试过程。
二.实验内容
1.掌握跳转指令的用法、学会使用无条件和条件跳转指令实现分支程序的编写。
2.掌握十六进制数转换为对应的ASCII码方法,并能够显示器输出。
阅读参考程序1,填充空行的程序,实现显示AL中两位十六进制数(1、2、3。
。
。
A、B。
。
。
E、F),并写出每行程序的注释。
3.掌握判别键盘输入字符的方法,以便实现后续的功能。
阅读参考程序2。
说明其实现的功能,并写出每行程序的注释。
三.实验要求
1.编写实验内容要求的两个程序;
2.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
四.实验环境
PC微机
Windows操作系统
Win-Masm编译环境
五.实验步骤
1.编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
2.对其进行汇编及连接,产生.EXE文件。
3.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。
六.思考题
1、依据参考程序1,编写程序实现显示AX寄存器中的四位十六进制数。
参考程序1:
;DISPHEX.ASM
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1;功能号01送AH
INT21H;执行系统功能调用,等待键盘输入,保存至AL
MOVBL,AL
MOVDL,AL
MOVCL,4
CMPDL,9
ADDDL,7
NEXT1:
ADDDL,30H
MOVAH,2;功能号02送AH
INT21H;显示高位ASCII码
MOVDL,BL
CMPDL,9
ADDDL,7
NEXT2:
ADDDL,30H
MOVAH,2
INT21H;显示低位ASCII码
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDSTART
参考程序2:
;DISPKEY.ASM
CODESEGEMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H;等待键入字符,送AL
CMPAL,0DH;是不是回车符?
JZDONE;是,则转DONE退出程序
CMPAL,’0’
JBNEXT
CMPAL,’9’
JACHARUP
MOVDL,AL
MOVAH,2
INT21H
JMPSTART
CHARUP:
CMPA