汇编上机说明书.docx
《汇编上机说明书.docx》由会员分享,可在线阅读,更多相关《汇编上机说明书.docx(16页珍藏版)》请在冰豆网上搜索。
汇编上机说明书
汇编软件MASM和调试
工具软件DEBUG使用
汇编语言是唯一能够充分利用计算机硬件特性并直接控制硬件设备的语言。
对于诸如实时控制、软件加密解密、病毒分析、软件调试等领域,汇编语言是最有效的程序设计语言。
在学习汇编语言的过程中,只有通过大量的上机实验才能更好地掌握汇编语言程序设计的技能。
1.1实验目的
(1)掌握汇编软件MASM的使用,熟悉汇编语言的上机过程。
(2)掌握调试工具软件DEBUG的应用,掌握汇编语言程序的调试技能。
1.2相关基础知识
1.2.1汇编语言程序上机步骤
1.汇编语言程序设计上机步骤
汇编语言源程序的上机步骤包括编辑、汇编、链接、调试等几个过程,如图1-1所示。
图1.1汇编语言源程序上机步骤
源程序文件的编辑就是编写一个汇编语言源程序,它可以使用任何一个文件编辑器实现。
例如,Windows2000操作系统附件中的记事本。
编辑形成的文件最后一定要以.ASM后缀保存。
在编辑源程序的时候一定要将输入法切换到英文环境下,否则会出错。
2.汇编
汇编是把用汇编语言编写的源代码程序翻译成计算机能够识别的二进制机器语言程序。
目前常用的汇编程序是MASM,称为宏汇编程序。
宏汇编程序当前主要有两个版本:
MASM5.0和MASM6.0。
其中,MASM5.0的可执行文件是MASM.EXE,MASM5.0用于DOS环境下。
初学者首先学习使用MASM5.0。
而MASM6.0的可执行文件是ML.EXE。
汇编过程是将源程序翻译为等价的二进制机器语言的过程。
所产生的文件称为目标程序,其后缀为.OBJ。
在这个阶段中,将对源程序的语法进行检验,如果发现错误将给予提示。
错误提示分为严重错误和警告错误两种。
严重错误指示某些指令存在语法错误,不能形成对应的二进制机器指令。
而警告错误指示某些指令含义不够明确,需要提醒程序员注意。
程序员可以根据提示对源程序进行修改,直到得到正确的结果为止。
在汇编过程中还会产生列表文件和交叉引用文件。
列表文件的后缀为.LST,主要用于给出源程序和机器代码程序的清单,以供检查程序使用。
交叉引用文件的后缀为.CRF,它是一个为源程序所引用的各种符号进行前后对照的文件,主要用于给出不同程序段中互相引用的全部符号列表。
这两个文件是可有可无的,如果不需要生成这两个文件,可以在汇编过程中加以控制。
3.链接
在汇编过程中形成了目标文件(.OBJ),但是在该文件中,只是将源程序的操作码部分变成了机器码,而地址操作数还是可浮动的相对地址,不是实际地址,浮动地址需要再定位。
只有经过链接过程才能形成最后的可执行文件。
链接程序的功能就是把一个或多个目标文件合并成一个可执行文件,其后缀为.EXE。
其实在链接过程中一共形成两个文件:
第一个是可执行文件(.EXE)。
默认的可执行文件名字与源程序文件相同,也可以根据用户要求进行修改可执行文件的名字;链接过程中形成的第二个文件是内存映像文件(.MAP),它给出了每个段的地址分配情况和长度。
如果不需要该文件则可以在链接命令执行时直接输入Enter键。
在链接过程中还与一个库文件(.LIB文件)相关。
一般的汇编程序不需要库文件。
但是当汇编语言与高级语言(如C语言)接口时需要用到库文件。
此时输入相应的库文件名字即可。
4.运行
通过汇编和链接,最终形成的可执行文件已经排出了程序中的语法错误,可以直接执行。
但是可能还存在一些算法错误,这样的错误则要通过调试过程来修正。
常用的调试工具软件有DEBUG等。
5.汇编语言上机举例
例编写一个名字为ABCD.ASM的源程序,该程序的功能是在计算机屏幕上显示一个字符串“HELLO!
”。
1)编辑源程序
利用Windows2000操作系统附件中的“记事本”编辑如下源程序。
DATASEGMENT
S1DB'HELLO!
','$'
DATAENDS
STACKSEGMENTPARASTACK
DB64DUP(?
)
STACKENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAH,09H
MOVDX,OFFSETS1
INT21H
RET
MAINENDP
CODEENDS
ENDSTART
2)汇编
在MASM5.0中的汇编程序是MASM.EXE。
其命令格式为:
C:
〉MASMABCD.ASM¿
执行上述操作命令之后将在屏幕上显示如下信息:
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved
Objectfilename[ABCD.OBJ]:
¿
Sourcelisting[NUL.LST]:
¿
Crossreference[NUL.CRF]:
¿
50678+410090Bytessymbolspacefree
0warningErrors
0SevereErrors
在汇编过程中产生了三个文件,其默认的文件名显示在屏幕上,如果不需要做任何改变就直接按Enter键。
通过屏幕上的显示,可以了解到在本次汇编过程中没有发生错误和警告,因此可以继续进行链接操作。
3)链接
在MASM5.0中的汇编程序是LINK.EXE。
其命令格式为:
C:
〉LINKABCD¿
执行上述命令后将在屏幕上显示如下信息:
Microsoft(R)OverlayLinkerVersion3.6
Copyright(C)MirosoftCorp1983-1987.Allrightsreserved
RunFile[ABCD.EXE]
ListFile[NUL.MAP]:
Libraries[.LIB]:
在链接过程中产生了两个文件,其默认的文件名显示在屏幕上,如果不需要做任何改变就直接按Enter键。
对于库文件一栏,如果不需要使用库文件,可以直接按Enter键;如果需要使用库文件,则要求输入所使用的库文件名字。
4)运行
其命令格式为:
C:
〉ABCD¿
在屏幕上就可以看到“HELLO!
”的字样了。
1.2.2调试工具软件DEBUG
如果汇编语言的源程序中存在一些语法或格式上的错误,在汇编和链接过程中都可以被发现并得到纠正。
但是如果在源程序中存在着算法错误和逻辑错误,那就只有在调试过程中才能发现并纠正了。
常用的调试工具软件是DEBUG。
DEBUG提供了修改寄存器和内存单元内容的命令,可以很方便地修改寄存器、内存单元的内容,为调试程序、修改程序带来了方便。
在DEBUG状态下,还提供了调试、控制测试的环境。
用户可以在此环境下进行编辑、调试和执行等一些简单的汇编程序。
DEBUG有显示命令,通过显示命令,可以观察某个内存单元的内容、CPU内部某个寄存器的内容,并可以根据这些内容的变化情况分析、调试程序。
1.DEBUG的启动
假设在Windows2000的环境下,通过选择“程序”→“附件”→“命令提示符”进入DOS状态。
然后输入:
Debug [[drive:
][path] filename [parameters]]即可进入DEBUG环境。
其中,[drive:
][path]filename:
指定要测试的可执行文件的位置和名称。
[parameters]:
指定所需要的命令。
如果已经进入存放DEBUG文件的目录下,则可以使用简化的命令进入DEBUG。
简化命令的格式为:
Debug¿。
进入DEBUG后,显示DEBUG的提示符号,该提示符号为连字符 (-)。
2.DEBUG的主要命令
这里只介绍常用到的几个主要DEBUG命令,全部的DEBUG命令请参考相关文献。
1)A(汇编命令)
该命令的功能是从汇编语言程序语句创建可执行的机器码。
所有数值都是十六进制格式,必须按1~4个字符输入这些数值。
命令格式:
Aaddress
参数address是指定输入汇编语言指令的位置。
对 address 使用十六进制值,但是输入十六进制地址时不能以h字符结尾。
如果不指定地址,执行A命令后将在它上次停止处的地址开始汇编。
A命令使用举例如下。
-A0100:
0500
0100:
0500 MOVAL,05
0100:
0502 JMP NEAR 505
0100:
0505 JMP FAR 50A
M
2)C(比较命令)
该命令的功能是比较内存的两个区域存放的内容。
命令格式为:
Crange address
参数range指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。
参数address指定要比较的第二个内存区域的起始地址。
C命令使用举例如下。
-C100,10F 300
该命令对 100h~10Fh 的内存数据块与300h~30Fh的内存数据块进行比较。
Debug 响应前面的命令并显示如下信息(假定此时 DS = 197F):
197F:
0100 4D E4 197F:
0300
197F:
0101 67 99 197F:
0301
197F:
0102 A3 27 197F:
0302
197F:
0103 35 F3 197F:
0303
197F:
0104 97 BD 197F:
0304
197F:
0105 04 35 197F:
0305
197F:
0107 76 71 197F:
0307
197F:
0108 E6 11 197F:
0308
197F:
0109 19 2C 197F:
0309
197F:
010A 80 0A 197F:
030A
197F:
010B 36 7F 197F:
030B
197F:
010C BE 22 197F:
030C
197F:
010D 83 93 197F:
030D
197F:
010E 49 77 197F:
030E
197F:
010F 4F 8A 197F:
030F
注意:
列表中缺少地址197F:
0106和197F:
0306,这表明地址中的数据值是相同的。
3)D(显示内存命令)
该命令的功能是显示一定范围内存地址的内容。
命令格式:
D [range]
参数range指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。
如不指定range,将从以前D命令中所指定地址范围末尾开始显示128字节的内容。
D命令举例如下。
-DCS:
100 10F
Debug按以下格式显示范围中的内容:
04BA:
0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER...
...
当使用D命令时,Debug以两个部分显示内存内容:
十六进制部分(每个字节的值都用十六进制格式表示)和ASCII码部分(每个字节的值都用 ASCII 码字符表示)。
每个非打印字符在显示的 ASCII 部分由英文句号(.)表示。
每个显示行显示 16 字节的内容,其中在第8和第9字节之间有一个连字符。
每个显示行从 16 字节的边界上开始。
4)G(运行命令)
该命令功能是运行当前在内存中的程序。
命令格式:
G [=address] [breakpoints]
参数address指定当前在内存中要开始执行的程序地址。
如果不指定 address参数,将从CS:
IP寄存器中的当前地址开始执行程序。
参数breakpoints为G命令设置的临时断点。
如果命令中有指定断点参数,则程序在遇到的第一个断点处停止,当程序到达断点时,Debug 将显示所有寄存器的内容、所有标记的状态以及最后执行指令的解码形式。
5)Q(退出命令)
该命令功能是该停止 Debug 会话,返回到命令提示符。
命令格式:
Q
参数:
无。
6)R(寄存器显示命令)
该命令功能是显示或改变一个或多个 CPU 寄存器的内容。
R [register-name]
参数:
无。
如果在没有参数的情况下使用,则 R 命令显示所有寄存器的内容以及寄存器存储区域中的标志。
参数:
register-name 指定要显示其内容的寄存器名。
举例如下。
要查看所有寄存器的内容、所有标记的状态和当前位置的指令解码表,请输入以下命令:
R
如果当前位置是 04BA:
011A,显示结果将类似如下:
AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:
011A CD21 INT 21
如果只想查看标志的状态,请输入以下命令:
RF
Debug按以下格式显示信息:
NV UP DI NG NZ AC PE NC - _
7)T(跟踪命令)
该命令功能是执行一条指令,并显示所有寄存器的内容、所有标志的状态和所执行指令的源代码形式。
命令格式:
T [=address] [number]
参数=address指定Debug启动跟踪指令的地址。
如果省略address参数,跟踪将从当前CS:
IP寄存器所指定的地址开始。
参数number指定要跟踪的指令数。
该值必须是十六进制数,默认值为1。
举例如下。
要执行一个指令(CS:
IP 指向的指令),然后显示寄存器的内容、标志的状态以及指令的解码形式,请输入以下命令:
T
如果程序中的指令位于 04BA:
011A,Debug 可能显示下列信息:
AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:
011A CD21 INT 21
8)U(反汇编命令)
该命令功能是反汇编字节并显示相应的原语句,其中包括地址和字节值。
反汇编代码像已汇编文件的列表。
命令格式:
U [range]
参数无。
如果在没有参数的情况下使用,则U命令将反汇编20H字节的内容(默认值),从前面U命令所显示地址后的第一个地址开始。
参数range指定要反汇编代码的起始地址和结束地址,或起始地址和长度。
举例如下。
要反汇编16(10h)字节,从地址 04BA:
0100 开始,请输入以下命令:
U04ba:
010010
Debug 按以下格式显示结果:
04BA:
0100 206472 AND [SI+72],AH
04BA:
0103 69 DB 69
04BA:
0104 7665 JBE 016B
04BA:
0106 207370 AND [BP+DI+70],DH
04BA:
0109 65 DB 65
04BA:
010A 63 DB 63
04BA:
010B 69 DB 69
04BA:
010C 66 DB 66
04BA:
010D 69 DB 69
04BA:
010E 63 DB 63
04BA:
010F 61 DB 61
1.3汇编语言上机实验
实验1.1设数据段字节变量S0中存放一个非压缩型BCD码,将其转为ASCII码,并显示在屏幕上。
1.分析
所谓非压缩BCD码就是每字节只存放一个BCD码,该字节的低4位为BCD码,而高4位为0000。
BCD码不能直接用于屏幕显示和打印,必须将其转换为ASCII码。
非压缩BCD码转换为ASCII码的算法很简单,就是在非压缩BCD码上加上30H。
2.实验步骤
(1)调用文本编辑软件建立源程序.ASM文件。
利用Windows2000操作系统附件中的“记事本”编辑以下源程序。
命名为Test1.ASM。
DATASEGMENT
S0DB1;待显示的BCD码
DATAENDS
STACKSEGMENTPARASTACK
DB64DUP(?
)
STACKENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAL,S0
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
RET
MAINENDP
CODEENDS
ENDSTART
(2)调用汇编程序MASM对源程序汇编产生.OBJ文件。
在C:
>提示符下输入MASMTest1.ASM¿
执行上述操作命令之后将在屏幕上显示如下信息:
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved
Objectfilename[Test1.OBJ]:
¿
Sourcelisting[NUL.LST]:
¿
Crossreference[NUL.CRF]:
¿
50678+410090Bytessymbolspacefree
0warningErrors
0SevereErrors
(3)调用链接程序LINK对目标文件进行链接产生可执行文件。
在C:
>提示符下输入LINKTest1¿
执行上述命令后将在屏幕上显示如下信息:
Microsoft(R)OverlayLinkerVersion3.6
Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved
RunFile[Test1.EXE]
ListFile[NUL.MAP]:
Libraries[.LIB]:
(4)运行可执行文件。
在C:
>提示符下输入Test1¿,在屏幕上将显示出1。
(5)改变S0的内容(数字范围要限制在0~9之间),重新做这个实验。
实验1.2设数据段变量S1中存放一个小写英文字符'A',要求将其转为大写英文字符,并显示在屏幕上。
试编写一段程序并运行该程序从而完成上述要求。
提示:
小写英文字符的ASCII码和大写英文字符的ASCII码之间存在一个差值。
1.4应用DEBUG软件调试程序实验
实验1.3常用的DEBUG命令使用练习。
实验步骤
1)进入DEBUG环境
在Windows2000环境下,按顺序选择“开始”→“程序”→“附件”→“命令提示符”后进入DOS环境,输入DEBUG后即可进入DEBUG,此时屏幕上显示“_”提示符号。
2)A(编辑命令)使用练习
用DEBUG的A命令输入程序。
_A100¿
0357:
0100MOVAL,34
0357:
0102MOVDL,36
0357:
0104ADDDL,AL
0357:
0106SUBDL,32
0357:
0109MOVAH,2
0357:
010BINT21
0357:
010DINT20
0357:
010F¿
输入A命令时,自动产生程序所存内存单元的段地址和偏移地址。
程序输入结束时,只需输入Enter键就可以退出汇编状态(A状态),回到DEBUG状态。
注意:
使用A命令时,只要注意起始地址的偏移地址从0100开始即可。
至于前面的段地址是随机变化的(取决于当前内存使用情况),对此不必介意。
3)C(比较命令)使用练习
首先利用A命令输入以下内容。
_A100¿
0357:
0100MOVAL,34
0357:
0102MOVDL,36
0357:
0104ADDDL,AL
0357:
0106SUBDL,32
0357:
0109MOVAL,34
0357:
010BMOVDL,36
0357:
010DADDDL,AL
0357:
010FSUBDL,30
0357:
0112¿
然后利用C命令对0100~0108与0109~0112两个区域内存存放的内容进行比较。
-C100,108 109
该命令执行后将显示两块存储区域存放内容不一致的那些单元。
4)D(显示内存命令)使用练习
首先利用A命令输入以下内容。
_A100¿
0357:
0100DW0100
0357:
0102DW0302
0357:
0104DW0504
0357:
0106DW0706
0357:
0108DW0908
0357:
010ADW0B0A
0357:
010CDW0D0C
0357:
010EDW0F0E
0357:
0110
之后利用D命令查看该区域内容。
_D100
5)R(寄存器显示命令)使用练习
首先利用A命令输入以下内容。
_A100¿
0357:
0100MOVAL,34
0357:
0102MOVAH,36
0357:
0104MOVBL,AL
0357:
0106MOVBH,32
0357:
0108MOVCL,55
0357:
010AMOVCH,AA
0357:
010CMOVDL,AL
0357:
010EMOVDH,30
0357:
0110
利用运行命令G运行,G=100,110
使用R命令看各寄存器结果(与R命令相结合做练习)。
利用R命令分别查看AX、BX、CX、DX、AL、AH、BL、BH、CL、CH、DL和DH内容。
利用R命令将AX、BX、CX和DX的内容都改为55AA。
6)G(运行命令)使用练习
首先利用A命令输入以下内容。
_A100¿
0357:
0100MOVAL,34
0357:
0102MOVAH,36
0357:
0104MOVBL,AL
0357:
0106MOVBH,32
0357:
0108MOVCL,55
0357:
010AMOVCH,AA
0357:
010CMOVDL,AL
0357:
010EMOVDH,30
0357:
0110
然后执行运行命令:
G=100,10E。
之后使用R命令查看有关寄存器内容。
7)T(跟踪命令)使用练习
首先利用A命令输入以下内容。
_A100¿
0357:
0100MOVAL,34
0357:
0102MOVAH,36
0357:
0104MOVBL,AL
0357:
0106MOVBH,32
0357:
0108MOVCL,55
0357:
010AMOVCH,AA
0357:
010CMOVDL,AL
0357:
010EMOVDH,30
0357:
0110
然后执行T=100,1命令。
观察程序运行情况和指令执行后寄存器的变化情况。
再执行T=100,2观察程序运行结果。