微型计算机原理与接口技术实验Word下载.docx
《微型计算机原理与接口技术实验Word下载.docx》由会员分享,可在线阅读,更多相关《微型计算机原理与接口技术实验Word下载.docx(118页珍藏版)》请在冰豆网上搜索。
Microsoft公司推出有宏汇编程序MASM和小汇编程序ASM两种,二者的区别在于:
MASM有宏处理功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64KB),只能使用ASM。
2.目标程序的连接过程
汇编后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件),还不能直接运行,它必须通过连接程序(LINK)连接成一个可执行程序后才能运行。
连接程序进行连接时,其输入有两个部分:
一个是目标文件(.OBJ),目标文件可以是一个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;
另一个是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。
连接后输出两个文件,一是扩展名为.EXE的可执行文件,另一个是扩展名为.MAP的内存分配文件。
.MAP文件是连接程序的列表文件,又称为连接映像(LinkMap),它给出每个段在存储器中的分配情况,该文件可有可无。
.EXE文件可以在操作系统下执行,还可以用DEBUG进行调试。
3.汇编语言程序设计上机过程举例
编写程序,判断一个年份是否是闰年。
汇编语言程序设计上机过程如图1.1所示。
图1.1汇编语言程序上机过程
(一)用编辑程序EDIT建立汇编语言源程序文件(ASM文件)
例如,编写程序,判断一个年份是否是闰年的汇编语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM。
也可以在Windows2000或者在WindowsXP环境下鼠标单击“开始”→“运行”,在“运行”中输入“CMD”进入DOS模式,运行EDIT软件,例如:
C>
EDITABC.ASM
进入EDIT的程序编辑画面时,输入汇编语言源程序如下:
DATASEGMENT
INFONDB0DH,0AH,'
Pleaseinputayear:
$'
YDB0DH,0AH,'
Thisisaleapyear!
NDB0DH,0AH,'
Thisisnotaleapyear!
WDW0
BUFDB8
DB?
DB8DUP(?
)
DATAENDS
STACKSEGMENT'
stack'
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEADX,INFON
MOVAH,9
INT21H
LEADX,BUF
MOVAH,10
MOVCL,[BUF+1]
XORCH,CH
LEADI,BUF+2
CALLDATACATE
CALLIFYEARS
JCA1
LEADX,N
JMPEXIT
A1:
LEADX,Y
EXIT:
MOVAH,4CH
DATACATEPROCNEAR
LEASI,BUF+2
MOVBX,0
X3:
MOVAL,[SI]
SUBAL,30H
MOVAH,0
XCHGAX,BX
MOVDX,10D
MULDX
ADDBX,AX
INCSI
LOOPX3
MOVW,BX
RET
DATACATEENDP
IFYEARSPROCNEAR
PUSHBX
PUSHCX
PUSHDX
MOVAX,W
MOVCX,AX
MOVDX,0
MOVBX,4
DIVBX
CMPDX,0
JNZLAB1
MOVAX,CX
MOVBX,100
JNZLAB2
MOVBX,400
JZLAB2
LAB1:
CLC
JMPLAB3
LAB2:
STC
LAB3:
POPDX
POPCX
POPBX
IFYEARSENDP
CODEENDS
ENDSTART
(二)用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件)
当源程序建立以后,仍以ABC.ASM程序为例,我们用汇编程序MASM对ABC.ASM源程序文件进行汇编,以便产生机器码的目标程序文件ABC.OBJ,其操作步骤如下:
MASMABC
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981–1985,1987.Allrightsreserved.
Objectfilename[ABC.OBJ]:
Sourcelisting[NUL.LST]:
ABC
Cross-reference[NUL.CRF]:
50674+450574Bytessymbolspacefree
0WarningErrors
0SevereErrors
由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。
第一个提示行为:
Objectfilename[ABC.OBJ]:
这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示),这是我们汇编的主要目的。
第二个提示行为:
Sourcelisting[NUL.LST]:
这是询问是否建立列表文件。
若不建立,直接回车;
若要建立,可以输入文件名ABC再回车,表示要建立名为ABC的列表文件。
列表文件中同时列出源程序和机器语言程序清单,并给出符号表,有利于程序调试。
第三个提示行为:
Cross-reference[NUL.CRF]:
这是询问是否要建立交叉索引文件。
若不建立,则直接回车;
若要建立,可以输入文件名ABC,表示要建立ABC.CRF文件。
由于.CRF是非文本文件,为了建立交叉索引文件,还必须调用CREF.EXE程序,即输入:
C>
CREFABC
Microsoft(R)Cross-ReferenceUtilityVersion5.00
Copyright(C)MicrosoftCorp1981–1985,1987.Allrightsreserved.
listing[ABC.REF]:
17Symbols
这时首先显示版本号,然后出现一个提示行:
Listing[ABC.REF]:
这是询问交叉索引文件名。
这时可用回车承认方括号内机器默认的文件名,如上所示。
这样就建立了ABC.REF文件。
其内容是用户定义的所有符号(包括变量),并给出每个符号定义所在的行号(附以#)以及引用的行号。
如下是ABC.REF文件的内容:
MicrosoftCross-ReferenceVersion5.00SatDec0118:
49:
422007
SymbolCross-Reference(#definition,+modification)Cref-1
A1...............4247#
BUF...............15#35383955
CODE..............28#29111
DATA..............1#212930
DATACATE............4053#80
EXIT..............4650#
IFYEARS.............4182#110
INFON..............2#32
LAB1..............92103#
LAB2..............97102105#
LAB3..............104106#
N................10#43
STACK..............22#222729
START..............30#112
W................14#76+86
X3...............60#73
Y................6#47
17Symbols
调入汇编程序,当我们回答了上述各提示行的询问之后,汇编程序就对源程序进行汇编。
若汇编过程中发现源程序有语法错误,则列出有错误的语句和错误的代码。
错误分警告错误(WraningErrors)和严重错误(SevereErrors)。
警告错误是指汇编程序认为的一般性错误;
严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数及行号、错误的性质等。
这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序加以修改,修改后重新汇编,直到汇编后无错误为止。
(三)用连接程序LINK生成可执行程序文件(EXE文件)
经汇编后产生的二进制的目标程序文件(OBJ文件)并不是可执行程序文件(EXE文件),必须经连接以后,才能成为可执行文件。
连接程序并不是专为汇编语言程序设计的。
如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起。
这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件。
连接过程如下:
LINKABC
Microsoft(R)OverlayLinkerVersion3.60
Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.
RunFile[ABC.EXE]:
ListFile[NUL.MAP]:
Libraries[.LIB]:
在连接程序调入后,首先显示版本号,然后出现三个提示行。
这是询问要产生的可执行文件的文件名。
一般直接回车采用方括号内规定的隐含文件名。
这是询问是否要建立连接映象文件。
若要建立,则输入文件名再回车。
如果要建立该文件,可以输入文件名ABC。
这是询问是否用到库文件。
若无特殊需要,则直接回车即可。
上述提示行回答后,连接程序开始连接。
若连接过程中有错,则显示错误信息,错误分析清楚后,要重新调入编辑程序进行修改,然后重新汇编,再经过连接,直至无错为止。
连接以后,便产生了可执行程序文件(EXE文件)。
(四)程序的执行
当我们建立了可执行文件ABC.EXE后,就可直接在DOS下执行该程序:
根据程序提示,输入一个年份,计算机会输出是否闰年的结果。
二Debug的使用简介
通过编辑、汇编和连接后的程序是可以执行的程序。
但是,一个程序特别是比较复杂的程序不能保证没有一点错误。
因此,在投入正式运行前必须进行调试,以检查程序的正确性。
调试程序Debug就是用来调试汇编语言程序的一种工具。
Debug的主要功能有显示和修改寄存器及内存单元的内容;
按指定地址启动并运行程序;
设置断点使程序分段运行,以便检查程序运行过程中的中间结果或确定程序出错的位置;
反汇编被调试程序,它将一个可执行文件中的指令机器码反汇编成助记符指令并同时给出指令所在的内存地址;
单条追踪或多条追踪被调试程序,它可以逐条指令执行或几条指令执行被调试程序,每执行一条(或几条)指令后,Debug程序将中断程序的运行并提供有关结果信息;
汇编一段程序,在Debug的汇编命令下可以直接输入助记符指令,并将其汇编成可运行程序段。
此外,Debug还可以将磁盘指定区的内容或一个文件装入到内存或将内存的信息写到磁盘上等等。
启动Debug程序:
在C盘搜索得到DEBUG.EXE,然后双击,或在DOS状态下用下面的命令启动Debug程序:
DEBUG[路径文件名.扩展名]
Debug后面的文件名及路径是指被调试程序的文件名及路径,Debug后面的文件必须是程序的可执行文件,其扩展名可以是.EXE或.COM。
在此命令后,DOS将调试程序Debug调入内存,Debug接着将被调程序送入内存。
比如:
DEBUG123.EXE
(一)调试程序Debug的主要命令如下:
(1)显示内存单元内容的命令D
格式
(1):
-D地址
从指定地址开始,显示128个字节的内容,每一行的左边显示段内偏移地址,接着显示16个单元的内容,最右边区域则显示这一行的16个单元所对应的可显示的字符。
若无可显示的字符,则用圆点(小数点)填充。
D命令中的地址可为段内偏移量,也可为段基址和段内偏移量两部分,中间用冒号隔开,如1680:
0110,即指段基址为1680H,段内偏移量为0110H。
Debug中所显示的数据均为十六进制数,且省去了后面的H标志。
格式
(2):
-D范围
将显示指定地址范围内的内存单元的内容,起始地址可由段基址及段内偏移量两个部分组成,中间用冒号“:
”隔开,也可以只指出段内偏移量,而此时的段基址在DS中。
这里所说的范围包含起始地址和结束地址。
比如–DDS:
10001020
将显示数据段偏移地址为1000H到1020H的内容。
(2)修改内存单元内容的命令E
-E地址内容表
它的功能是用给定的内容表去代替所指定的内存单元的内容。
例如:
EDS:
011041‘CLOSE’41
该命令执行后,将用列表中的7个字符填入从DS:
0110到DS:
0116的7个存储单元中。
E地址
它的功能是可以连续地逐个修改内存单元的内容。
当屏幕上显示指定单元的地址和内容之后,可采取下列办法:
①若指定单元的内容需要修改,则将新的内容的十六进制数输入,再按空格键,修改便告完成,然后显示下一个存储单元的地址及内容,若需要修改,可进行同样的操作。
若某一个单元的内容不需要修改,而操作又要进行下去,则可直接按空格键。
②若需要显示前一个单元的地址和内容,则输入连接号′-′,若要修改,则输入新的内容;
若显示前一个单元的地址和内容仍要修改,则可进行同样的操作;
若显示的内容不需要修改,则可直接按′-′键,使该操作由高地址向低地址单元连续不断地进行。
③按<
CR>
键,结束E命令。
(3)检查和修改寄存器内容的命令R
R
此时将显示所有寄存器的内容和全部标志位的状态,以及现行CS:
IP所指的机器指令代码和反汇编符号。
R寄存器名
该格式可用于检查和修改指定寄存器的内容。
若不修改其内容,可按<
键,若需要修改其内容,可以输入1-4个十六进制数,再按<
键。
格式(3):
RF
该格式可用于显示标志和修改标志位状态。
当系统给出标志位状态后,可采取下列办法:
①若不需要修改任一标志位,可按<
②若需要修改一个或多个标志位,可输入其相反的值。
各标志位之间可以无空格且与顺序无关,修改后按<
由于标志位状态显示时,是用下列特殊符号表示的,因而修改时,只要输入规定的符号即可。
下面是标志名和状态符号的对照表:
标志名置位符号复位符号
溢出标志OF(是/否)OVNV
方向标志DF(减/增)DNUP
中断标志IF(允许/禁止)EIDI
符号标志SF(负/正)NGPL
零标志ZF(是/否)ZRNZ
辅助进位标志AF(是/否)ACNA
奇偶校验标志PF(偶/奇)PEPO
进位标志CF(是/否)CYNC
只有追踪标志TF,不能用指令直接修改
输入RF命令,系统可能作出如下响应:
OVDNEINGZRACPECY-
若现在要修改奇偶、零、中断和溢出标志位,可在光标处输入:
PONZDINV<
(4)运行程序命令G
格式:
G[=地址][地址[地址…]]
该命令可以在程序运行中设置断点。
它是Debug程序进行程序调试的主要命令之一。
示例:
-g001a则执行从当前cs:
ip至001a的指令,注意:
地址设置必须从指令的第一字节设起。
①第一个参数“=地址”规定了程序执行的起始地址,以CS内容作段地址,等号后面的地址只需给出地址偏移量。
此时,命令G与地址之间的等号不能省去。
如果在G命令执行前,已经设置了CS值和IP值,则也可以直接用G命令,从指定地址执行程序。
②格式中后面给出的地址是指断点地址,最多可设置10个断点。
当程序执行到一个断点时,就停下来,显示CPU各寄存器的内容和标志位的状态,以及下一条待执行的指令,被调试程序的所有断点全部被取消,并返回Debug。
③地址参数所指的单元,必须包含有效的8088指令的第一个字节,否则将产生不可预料的结果。
④堆栈必须至少包含有6个可用字节,否则也将产生不可预料的结果。
⑤若断点地址只包括地址偏移量,则认为段地址在CS寄存器中。
(5)追踪命令T
T[=地址]
该命令可以在指令执行中进行追踪,若略去地址,则从CS:
IP现行值执行。
每一次T命令都执行一条指令。
T[=地址][值]
此时,它可对多条指令进行追踪,即在执行了由值所指定的若干条指令之后,停止执行并显示各寄存器的内容和各标志位,还指出下一条待执行的指令。
(6)汇编命令A
若在调试目标程序的过程中,要求改写或增添一段目标程序,则可以用A命令直接在Debug下实现。
A[地址]
该命令可以从指定地址开始,将输入的汇编语言语句立即汇编成机器代码,连续存放在内存单元中。
在程序输入完毕后,最后一行不输入内容,直接按回车键,即可返回DEBUG程序,还可用反汇编命令U对刚输入的内容进行反汇编,以验证输入的程序是否正确。
使用A命令应遵守以下规则:
①所有输入数值,均为十六进制数。
②前缀助记符,必须在相关指令的前面输入,可以在同一行,也可以在不同行输入。
③段超越助记符为CS:
、DS:
、ES:
、SS:
。
④远调用时的返回指令助记符用RETF。
⑤使用串操作指令时,助记符中必须注明是字节还是字传送。
⑥汇编语言能自动汇编短、近和远的转移及近和远的调用,也能由NEAR和FAR前缀来超越。
0110:
0600JMP602;
短转移
0602JMPNEAR605;
近转移
0605JMPFAR60A;
远转移
第一条JMP指令中含有一个字节偏移量。
第二条JMP指令中含有两个字节偏移量。
第三条JMP指令中含有两个字节的偏移量及两个字节的段地址。
⑦当DEBUG不能确定某些操作数涉及的是字类型存储单元还是字节类型的存储单元时,在这种情况下,必须用前缀“WORDPTR”或“BYTEPTR”来加以说明。
例如:
NEGBYTEPTR[128]
DECWORD[SI]
⑧当Debug不能确定一个操作数是立即数还是存储单元的地址时,可以把地址放在方括号中。
⑨两个最常用的伪指令DB和DW可以在A命令中使用,用来直接把字节或字的值送入相应的存储单元。
DB2,5,3,4,′THISISANEXAMPLE′
DW6000,2000,7000,′BA′
⑩Debug支持所有形式的寄存器间接寻址命令。
ADDBX,74[BP+3][SI-5]
POP[BX+DI]
(7)反汇编命令U
U地址
该命令从指定的地址开始,反汇编32个字节。
若略去指定地址,则以上一个