汇编语言的运行方式_第1页
汇编语言的运行方式_第2页
汇编语言的运行方式_第3页
汇编语言的运行方式_第4页
汇编语言的运行方式_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.1用DEBUG运行汇编语言程序

DEBUG调试程序是以DOS外部命令程序的形式提供的,它的文件名是DEBUG.COM。在进入DEBUG的提示符‘-’之后,用户可以通过DEBUG的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序;然后调试并运行该程序。使用DEBUG运行汇编程序较之使用ASM和MASM运行汇编程序有以下优点:可在最下层环境下运行;免去使用ASM和MASM必须熟悉文本编辑程序、ASM和MASM本身程序以及LINK程序的麻烦,因而调试周期短程序员可在不熟悉ASM和MASM所涉及的伪指令的情况下运行汇编语言程序,为以后学习重点转移到程序设计打下坚实的使用指令编程的基础;熟悉DEBUG的命令使用,为以后的软件开发掌握调试工具,这是因为DEBUG除了可运行汇编语言程序外,还可以直接用来检查和修改内存单元、装入、存储及启动运行程序、检查及修改寄存器,也就是说DEBUG可深入到计算机的基本级,可使用户更紧密地与计算机中真正进行的工作相联系。然而能在DEBUG下运行汇编语言源程序也受到了一些限制,它不宜汇编较长的程序,不便于分块程序设计,不便于形成以DOS外部命令形式构成的EXE文件,不能使用浮动地址,也不能使用绝大多数ASM和MASM提供的伪指令。例3.1在DEBUG下运行如下程序:

MOVDL,33H;字符3的ASCII码送DLMOVAH,2;使用DOS的2号功能调用

INT21H;进入功能调用,输出‘3’

INT20H;BIOS中断服务程序正常结束。该程序运行结果是在显示器上输出一个字符‘3’。如果要输出其它字符,请改变程序中‘33H’为相应字符的ASCII码。其中涉及DOS和BIOS功能调用。因为我们是在DOS的支持下运行汇编语言程序,所以一般情况下,不能轻易使用输入/输出指令直接通过端口输入/输出,而必须使用DOS内部提供的子程序完成输入/输出。DOS功能调用就是为诸如此类的目的设置的。

DOS功能调用要求在进入INT21H调用前,首先将功能调用号,也就是功能种类号送AH寄存器,并依功能号准备初始数据。也就是说INT21H的2号功能调用是输出DL寄存器中字符。INT20H是BIOS中断服务子程序,这一软中断用来正常结束程序。运行步骤:

(1)进入DEBUG

设C盘上有DEBUG.COM程序,进入DOS后键入DEBUG〈ENTER〉,即C>DEBUG屏幕显示:-‘-’号是进入DEBUG的提示符,在该提示符下可键入任意DEBUG命令。现在用A命令送程序如下:(2)输入程序并汇编-A100169C:0100MOVDL,33169C:0102MOVAH,2169C:0104INT21169C:0106INT20169C:0108至此程序已送完,并汇编成机器指令。现在用G命令运行程序如下:(3)运行程序-G3Programterminatednormally

如果现在想看一下机器指令是什么样子的话,方法之一是可以用反汇编命令U作如下操作:(4)反汇编-U100,108169C:0100B233MOVDL,33169C:0102B402MOVAH,02169C:0104CD21INT21169C:0106CD20INT20169C:0108(5)写COM文件-RBXBX0000:-RCXCX0000:8-NEXCOM.COM-W(6)送机器指令程序-E200B233B402CD21CD20(7)执行机器指令程序-G=2003Pogramterminatednormally(8)退出DEBUG返回DOS,执行EXCOMCOM文件-QC>EXCOM3C>3.2DEBUG命令

DEBUG命令是在DEBUG提示符“-”下,由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键(ENTER)。命令及参数的输入可以是大小写的结合。Crtl+Break键可中止命令的执行。Crtl+NumLock键可暂停屏幕卷动,按任一键继续。所用数均为十六进制数,且不必写H。3.2.1汇编命令A

格式:(1)A〈段寄存器名〉:〈位移〉

(2)A〈段地址〉:〈位移〉

(3)A〈位移〉

(4)A功能:键入该命令后显示段地址和位移并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令,直到显示下一地址时用户直接键入回车键返回到提示符“”。其中(1)用指定段寄存器内容作段地址,(3)用CS内容作段地址,(4)以CS∶100作地址。以后命令中提及的各种‘地址’形式,均指(1)、(2)、(3)中A后的地址形式。3.2.2比较命令C

格式:C〈源地址范围〉,〈目标地址〉其中〈范围〉是由〈起始地址〉〈终止地址〉指出的一片连续单元,或〈起始地址〉L〈长度〉。功能:从〈源地址范围〉的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。遇有不一致时,以〈源地址〉〈源内容〉〈目标内容〉〈目标地址〉的形式显示失配单元及内容。3.2.3显示内存命令D

格式:(1)D〈地址〉(2)D〈范围〉(3)D功能:以两种形式显示指定内存范围内容。一种形式为十六进制内容,一种形式为相应字节的ASCII码字符,对不可见字符以‘·’代替。其中(1)以CS为段寄存器。(3)显示CS∶100起始的一片内容。3.2.4修改内存命令E

格式:(1)E〈地址〉〈单元内容〉(2)E〈地址〉〈单元内容表〉其中〈单元内容〉是一个十六进制数,或用引号′或″括起来的字符串;〈单元内容表〉是以逗号分隔的十六进制数,或用′或″括起来的字符串,或者是二者的组合。功能:(1)将指定内容写入指定单元后显示下一地址,可连续键入修改内容,直至新地址出现后键入回车〈ENTER〉止。(2)将〈单元内容表〉逐一写入由〈地址〉开始的一片单元。3.2.5填充内存命令F

格式:F〈范围〉〈单元内容表〉功能:将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。例如:

F5BC:200L10B2,′XYZ′,3C3.2.6

执行命令C

格式:(1)G(2)G=〈地址〉(3)G=〈地址〉,〈断点〉功能:(1)从CS∶IP开始执行(2)从指定地址开始执行(3)从指定地址开始执行,到断点自动停止。

3.2.7十六进制算术运算指令H

格式:H〈值1〉〈值2〉功能:求十六进制数〈值1〉和〈值2〉的和与差并显示结果。

3.2.8端口输入命令I

格式:I〈端口地址〉功能:将从指定端口输入的内容显示出来。3.2.9读盘命令L

格式:L〈地址〉〈盘号〉〈起始逻辑扇区〉〈所读扇区个数n〉

其中〈地址〉的缺省值为CS∶100。逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:物理扇区是按0面0道1区,0面0道2区,……0面0道9区,0面1道1区,……0面39道9区,1面0道1区,……1面39道9区排列。而逻辑扇区与物理扇区号的对应关系为物理扇区0面0道1扇区至9扇区,逻辑扇区号为0~8;物理扇区1面0道1扇区至9扇区,逻辑扇区号为9~11H;物理扇区0面1道1扇区至9扇区,逻辑扇区号为12~1AH……这样每道先0面后1面一直排下去。

其中〈盘号〉为0、1或2,0表示A盘,1表示B盘,2表示硬盘。功能:将〈盘号〉指定的盘上,从〈起始逻辑扇区〉起,共n个逻辑扇区上的所有字节顺序读入指定内存地址的一片连续单元。当L后的参数缺省时,必须在L之前由N命令指定(或进入DEBUG时一并指出)所读盘文件名。此时L执行后将该文件装入内存。例如:

NEXAMPLEL

将当前盘上的EXAMPLE文件装入CS:100起始的一片内存单元。

3.2.10内存搬家命令M

格式:M〈源地址范围〉〈目标起始地址〉其中源及目标地址若仅输入偏移量,则隐含相对DS。功能:把〈源地址范围〉中的内容顺序搬至〈目标起始地址〉起的一片连续单元。例如:

MCS:100110600

把从CS∶100起至CS∶110止17个字节搬至DS∶600至DS∶610的一片单元。3.2.11命名待读文件命令N

格式:N文件名说明功能:为L命令指定待装入文件注:其它形式参考DOS手册3.2.12端口输出命令O

格式:O〈端口地址〉〈字节〉功能:将该〈字节〉从指定〈端口地址〉输出。例如:

O2F4F将4FH从2FH口输出3.2.13结束DEBUG返回DOS命令Q格式:Q功能:返回DOS提示符下3.2.14显示寄存器命令R

格式:(1)R

(2)R〈寄存器名〉功能:(1)显示当前所有寄存器内容、状态标志及将要执行的下一指令的地址、代码及汇编语句形式。其中对状态标志FLAG以每位的形式显示,详见表3-1。

表3-1状态标志显示形式

标志位状态显示形式溢出标志OF有/无OV/NV

方向标志DF减/增DN/UP

中断标志IF开/关

EI/DI

符号标志SF负/正NG/PL

零标志ZF零/非ZR/NZ

辅助标志AF有/无AC/NA

奇偶标志PF偶/奇PE/PO

进位标志CF有/无CY/NC(2)显示指定存储器内容例如:

RAXRF3.2.15

搜索指定内存命令S

格式:S〈地址范围〉〈表〉功能:在指定范围搜索表中内容,找到后显示表中元素所在地址例如:

SCS:10011041显示04BA:010404BA:010D表示在位移100H至110H间的上述两处有41H。又如:

SCS:100L1141″AB″E表示在当前代码段位移100H至111H处找连续4个字节内容为41H、41H、42H、0EH的地址。3.2.16执行并显示系统环境命令T

格式:T[=〈地址〉][〈条数〉]功能:〈地址〉的缺省值是当前IP值,〈条数〉的缺省值是一条。执行由指定地址起始的、由〈条数〉指定的若干条命令。例如:

T执行当前指令并显示状态T10从当前指令始执行10H条指令

3.2.17反汇编命令U

格式:(1)

U〈地址〉(2)U〈地址范围〉功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。3.2.18写盘命令W

格式:W〈地址〉〈盘号〉〈起始逻辑扇区〉〈所写逻辑扇区数n〉功能:与L命令不同的地方是将内存〈地址〉起始的一片单元内容写入指定扇区。只有W而没有参数时,与N命令配合使用写盘文件。3.3DEBUG命令综合使用例

例3.2进入DEBUG,使用A命令将源程序写入内存,使用G命令执行,再用U命令反汇编,接着用D命令显示后,用Q命令退出DEBUG,返回DOS提示符。(1)进入DEBUG,并用A命令直接写入并汇编一个程序A>debug-A1001392:0100MOVDL,331392:0102MOVAH,21392:0104INT211392:0106INT201392:0108(2)执行该程序

G3Programterminatednormally(3)用U命令反汇编-U1001081392:0100B233MOVDL,331392:0102B402MOVAH,021392:0104CD21INT211392:0106CD20INT201392:010861DB61(4)用D命令显示内存

D1001081392:0100B233B402CD21CD2061.3...!.a例3.3进入DEBUG,先显示200H处开始的一片单元,接着用E命令,将一段机器代码指令(就是上面的一段小程序)写入200~208H,然后执行,再用U命令反汇编。A>DEBUG

D2001392:020000000000000000000000000000000000...............1392:021000000000000000000000000000000000...............1392:02204E8700004E924E9D4EA84EB34EBE4EC9N...N.N.N.N.N.N.1392:02304ED44EDF00004EEA4EF54E004F0B4F16N.N...N.N.N.O.O.1392:02404F214F2C4F377A034F001301FF00A705O!O,O7z.O.......1392:02508000CE04100021D740AF21D740AF21D7......!.@.!.@.!.1392:0260400422B7400422D7402F21D7402F21E2@.″.@.″@/!.@/!.1392:027043CC21B7406B21C740AF21C740AF21C7C.!.@K!.@.!.@.!(1)用E命令把代码指令写入内存

E200B233B402CD21CD201B(2)用G命令从200H开始执行

G=2003Programterminatednormally(3)用U命令反汇编-U2002081392:0200B233MOVDL,331392:0202B402MOVAH,021392:0204CD21INT211392:0206CD20INT201392:02081B00SBBAX,[BX+SI]-QA>例3.4进入DEBUG,用A命令送程序,用R命令显示,并用T命令单条执行

(1)进入并用A命令写入汇编源程序

A>DEBUG

A100

1392:0100MOVAH,3

1392:0102MOVAL,2

1392:0104ADDAL,AH

1392:0106INT20

1392:0108

(2)用R命令显示寄存器状态

R

AX=0000BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0100NVUPEIPLNZNAPONC

1392:0100B403MOVAH,03

(3)用T命令单条执行

T

AX=0300BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0102NVUPEIPLNZNAPONC

1392:0102B002MOVAL,02

T

AX=0302BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0104NVUPEIPLNZNAPONC

1392:010400E0ADDAL,AH

(4)结果在AL中(AL)=5

T

AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=1392IP=0106NVUPEIPLNZNAPONC

1392:0106CD02INT20

T

AX=0305BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000

DS=1392ES=1392SS=1392CS=011CIP=1094NVUPDIPLNZNAPONC

011C:109490NOP

(5)用G命令接着执行

G

Programterminatednormally(6)退出

Q

A>

例3.5除以前接触过的命令外,下面还使用了整片搬家命令M,以及比较一片内存单元与另一片内存单元内容的命令C。

(1)进入DEBUG,显示100H至110H内容

A>DEBUG

D100110

1392:01000F00B98AFFF3AE4761031F8BC34812B1.......Ga....H..

1392:011004

(2)用F命令将31H装入100H至110H

F10011031

(3)用D显示100H至117H

D100117

1392:0100313131313131313131313131313131311111111111111111

1392:0110318BC6F70AD0D31.......

(4)用E命令修改105H至108H的内容

E10561,61,62,63

(5)用D命令显示100H至110H的内容

D100110

1392:01003131313131616162633131313131313111111aabc1111111

1392:011031

1

(6)用M命令将100H至110H的内容复制到200H至210H

M100110200

(7)用D命令显示200H至210H的内容

D200210

1392:02003131313131616162633131313131313111111aabc11111111392:0210311

(8)用E命令修改201H,202H,203H,20DH,20EH,20FH内容

E201323134

E20D414243

(9)用D命令显示200H至210H内容及100H至110H内容

D200210

1392:02003132313431616162633131313141424312141aabc1111ABC

1392:0210311

D100110

1392:01003131313131616162633131313131313111111aabb1111111

1392:0110311

(10)用C命令比较100H至110H与200H至210H的内容,并显示二者不一致的部分

-C100110200

1392:01031321392:0201

1392:010331341392:0203

1392:010D31411392:020D

1392:010E31421392:020E

1392:010F31421392:020F

-Q

A>

例3.6以下是使用E命令和S命令的例子。

E300′ABCDEFG′

D300306

1392:030041424344454647ABCDEFG

E3101234′″

D310315

1392:0310273132333427′1234′

E320313233414243

D320325

1392:0320313233414243123ABC

S300306′D′

1392:0303

S310315′D′

S310315′3′

1392:0313

S310315′

1392:0310

1392:0315

D310325

1392:0310273132333427221341AF211341AF2113′1234′″.A.!.A.!.

1392:0320313233414243123ABC

Q

例3.7以下用L命令将A盘目录读入内存。因为对双面双密软盘,盘目录区在0道0面6扇区,而L10000B是将A盘上从0面0道1扇区始共11个逻辑扇区读入内存,每扇区512个字节,所以读入内存后目录在当前段0B00H处,用D命令可显示出所有目录项。退出DEBUG后将E9文件删除。再进入DEBUG,并将目录读入内存,显示出可见文件名E9的目录项还在,但E字母处已变为E5H,这是文件已删标志。现用E命令修改它仍为E字母的ASCII码45H,并用W命令记盘可见文件已恢复。

(1)进入DEBUG前先显示A盘目录

C>dira:

VolumeindriveAhasnolabel

VolumeSerialNumberis0C6218C9

DirectoryofA:\

E5273031007905:05p

E5328751007905:17p

E54105581007905:47p

E920501007906:03p

E9217441007906:05p

E1020501007906:10p

6file(s)26580bytes

331776bytesfree

(2)进入DEBUG,并用L命令将A盘上0扇区起共11个逻辑扇区读入内存169C:0100起始一片单元

C>debug

L10000b

(3)显示0B00起始的内存内容

db00

169C:0B0045353220202020202020202000000000E52....

169C:0B10000000000000BB8847150200871C0000........G.......

169C:0B2045353320202020202020202000000000E53....

169C:0B300000000000002F8A47150A003B0B0000....../.G...;...

169C:0B4045353420202020202020202000000000E54....

169C:0B50000000000000F68D47150D003E290000........G...>)..

169C:0B6045392020202020202020202000000000E9....

169C:0B700000000000006.....n.G.......

-d

169C:0B8045393220202020202020202000000000E92....

169C:0B90000000000000BB9047151B0000060000........G.......

169C:0BA045313020202020202020202000000000E10....

169C:0BB0000000000000469147151D0002080000......F.G.......

169C:0BC000000000000000000000000000000000................

169C:0BD000000000000000000000000000000000................

169C:0BE000000000000000000000000000000000................

169C:0BF000000000000000000000000000000000................

-q

C>

(4)删除文件e9

C>

C>erasea:e9

C>dira:e9

VolumeindriveAhasnolabel

VolumeSerialNumberis0C6218C9

DirectoryofA:\

Filenotfound

(5)进入DEBUG并用L再读盘,用D命令显示,可见该文件已删

C>debug

L10000b

db00

169C:0B0045353220202020202020202000000000E52....

169C:0B10000000000000BB8847150200871C0000........G.......

169C:0B2045353320202020202020202000000000E53....

169C:0B300000000000002F8A47150A003B0B0000....../.G...;...

169C:0B4045353420202020202020202000000000E54..

..

169C:0B50000000000000F68D47150D003E290000........G...>)..

169C:0B60E5392020202020202020202000000000.9....

169C:0B700000000000006.....n.G.......

(6)用E命令恢复字母E

e0b6045

d0b600b6f

169C:0B6045392020202020202020202000000000E9....

(7)修改后写盘

w10000b

q

(8)可见已恢复

C>dira:

VolumeindriveAhasnolabel

VolumeSerialNumberis0C6218C9

DirectoryofA:\

E5273031007905:05p

E5328751007905:17p

E54105581007905:47p

E920501007906:03p

E9217441007906:05p

E1020501007906:10p

6file(s)26580bytes

334848bytesfree

例3.8对于1.2M软盘引导记录占1个扇区,第一文件定位表FAT1占7个扇区,第二文件定位表FAT2占7个扇区,根目录占14个扇区。因此可以用L1000020将根目录读入内存,于是可用例37的方法恢复已删除的文件。例如删除e9再恢复。

C>dirA:

VolumeindriveAhasnolabel

VolumeSerialNumberis455518E4

DirectoryofA:\

E5273031007905:05p

E5328751007905:17p

E54105581007905:47p

E920501007906:03p

E9217441007906:05p

E1020501007906:10p

6file(s)26580bytes

785920bytesfree

C>debug

L1000020

d1f00

169C:1F0045353220202020202020202000000000E52....

169C:1F10000000000000BB8847150200871C0000........G.......

169C:1F2045353320202020202020202000000000E53....

169C:1F300000000000002F8A47150A003B0B0000....../.G...;...

169C:1F4045353420202020202020202000000000E54..

..

169C:1F50000000000000F68D47150D003E290000........G...>)..

169C:1F6045392020202020202020202000000000E9....

169C:1F700000000000006.....n.G.......

q

C>dela:e9

C>dira:e9

VolumeindriveAhasnolabel

VolumeSerialNumberis455518E4

DirectoryofA:\

Filenotfound

C>debug

-L1000020

-d1f00

169C:1F0045353220202020202020202000000000E52....

169C:1F10000000000000BB8847150200871C0000........G.......

169C:1F2045353320202020202020202000000000E53....

169C:1F300000000000002F8A47150A003B0B0000....../.G...;...

169C:1F4045353420202020202020202000000000E54..

..

169C:1F50000000000000F68D47150D003E290000........G...>)..

169C:1F60E5392020202020202020202000000000.9....

169C:1F700000000000006.....n.G.......

e1f6045

d1f601f6f

169C:1f6045392020202020202020202000000000E9....

-w1000020

-q

C>dira:

VolumeindriveAhasnolabel

VolumeSerialNumberis455518E4

DirectoryofA:\

Filenotfound

E5273031007905:05p

E5328751007905:17p

E54105581007905:47p

E920501007906:03p

E9217441007906:05p

E1020501007906:10p

6file(s)26580bytes

788480bytesfree

例3.9利用DEBUG调试EXE文件

(1)程序清单及汇编连接步骤

A>typeSAM.ASM

CODESEGMENT

ASSUMECS:CODE

START:MOVDL,33H

MOVAH,2

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

C>MASMSAM;

microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.

51774+401858Bytessymbolspacefree

0warningErrors

0SevereErrors

C>LINKSAM;

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp19831987.Allrightsreserved.

LINK:warningL4021:nostacksegment

C>SAM

3

C>DEBUGSAM.EXE

G

3

Programterminatednormally

Q

(2)用N命令装入,用G命令执行C>DEBUG

NSAM.EXE

L

R

AX=0000BX=0000CX=000ADX=0000SP=0000BP=0000SI=0000DI=0000

DS=16ADES=16ADSS=16BDCS=16BDIP=0000NVUPEIPLNZNAPONC

16BD:0000B233MOVDL,33

-U16BD:00000008

16BD:0000B233MOVDL33

16BD:0002B402MOVAH,O2

16BD:0004CD21INT21

16BD:0006B44CMOVAH,4C

16BD:0008CD21INT21

G

3

Programterminatednormally

Q

(3)装入执行后,再用T命令单条执行

C>DEBUGSMA.EXE

R

AX=0000BX=0000CX=000ADX=0000SP=0000BP=0000SI=0000DI=0000

DS=16ADES=16ADSS=16BDCS=16BDIP=0000NVUPEIPLNZNAPONC

16BD:0000B233MOVDL,33

T=0

AX=0000BX=0000CX=000ADX=0033SP=0000BP=0000SI=0000DI=0000

DS=16ADES=16ADSS=16BDCS=16BDIP=0002NVUPEIPLNZNAPONC

16BD:0002B402MOVAH,02

T

AX=0200BX=0000CX=000ADX=0033SP=0000BP=0000SI=0000DI=0000

DS=16ADES=16ADSS=16BDCS=16BDIP=0004NVUPEIPLNZNAPONC

16BD:0004CD21INT21

G

3

Programterminatednormally

Q

3.4用MASM(或ASM)运行汇编语言程序

一个能经MASM(或ASM)汇编后运行的汇编语言源程序不同于在DEBUG下运行的汇编语言程序。首先在程序的书写方式上要加上逻辑段的说明,而且必须至少有一个逻辑代码段。其次一个书写正确的源程序必须经过源程序输入、汇编、连接后产生一个EXE文件,才能作为DOS的外部命令在DOS下运行。小汇编(ASM)下的汇编语言程序可在64KB的内存条件下运行,且只能有限地使用伪指令。而宏汇编(MASM)下则必须在96KB以上的内存条件下运行,且可使用各种伪指令。本书中的例子均在MASM下通过。ASM和MASM的程序运行过程除汇编时用ASM代替MASM进行汇编外,其它步骤完全相同。

3.4.1MASM汇编语言程序的调试步骤在MASM下调试运行汇编语言程序的步骤如图3-1所示:

3.4.2典型实例

下面通过几个典型例子说明汇编语言的运行步骤。

例3.10在MASM下运行与例3.1功能相同的程序,请读者务必注意二者在程序结构上的不同和运行方式的不同,具体步骤如下:

(1)运行环境的准备

一张操作系统盘,例如DOS50

一张汇编系统盘,应含如下文件:

MASM宏汇编程序文件

LINK连接程序文件

CREF索引程序文件

EDLIN行文本编辑程序

一张已格式化的空盘,用以存储用户程序。

准备好上述3张盘后应用DOS盘进入DOS

A>

(2)利用任何文本编辑输入源程序,扩展名必须为ASM。本例源程序文件名为SAMASM。

A>typesam.asm

CODESEGMENT

ASSUMECS:CODE

START:MOVDL,33H

MOVAH,2

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

(3)汇编

A>masm

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.

Sourcefilename[.ASM]:sam

Objectfilename[sam.OBJ]:

Sourcelisting[NUL.LST]:sam

Crossreference[NUL.CRF]:sam

50698+402934Bytessymbolspacefree

0WarningErrors

0SevereErrors

(4)连接

A>link

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp19831987.Allrightsreserved.

ObjectModules[.OBJ]:sam

RunFile[SAM.EXE]:

ListFile[NUL.MAP]:sam

Libraries[.LIB]:

LINK:warningL4021:nostacksegment

(5)执行

①直接执行

A>sam

3

②在DEBUG下执行,必须写全名

A>c:\dos\debug

nsam.exe

1

g

3

Programterminatednormally

q

(6)产生索引表文件并输出

A>cref

Microsoft(R)CrossReferenceUntilityVersion5.00

Copyright(C)MicrosoftCorp19811985,1987.Allrightsreserved.

Crossreference[.CRF]:sam

Listing[sam.REF]:

2Symbols

A>typesam.ref

SymbolCrossReference(#definition,+modification)Cref1

CODE..............1#28

START.............3#9

2Symbols

(7)打印LST清单文件和MAP文件如下:

A>typesam.lst

10000CODESEGMENT

2ASSUMECS:CODE

30000B233START:MOVDL,33H

40002B402MOVAH,2

50004CD21INT21H

60006B44CMOVAH,4CH

70008CD21INT21H

8000ACODEENDS

9ENDSTART

SegmentsandGroups:

NameLengthAlignCombineClass

CODE..............000APARANONE

Symbols:

NameTypeValueAttr

START.............LNEAR0000CODE

@FILENAME..........TEXTsam

9SourceLines

9TotalLines

4Symbols

50698+402934Bytessymbolspacefree

0WarningErrors

0SevereErrors

A>TYPESAM.MAP

LINK:WarningL4021:nostacksegment

StartStopLengthNameClass

00000H00009H0000AHCODE

Programentrypointat0000:0000

例311汇编和连接可采取简单的办法。下面是完成与例3.10相同功能的程序的执行步骤。设源程序文件为SAM1.ASM。

(1)用行编辑输入源程序

A>edlinsam1.asm

Newfile

*i

1:*CODESEGMENT

2:*STARTPROCFAR

3:*ASSUMECS:CODE

4:*PUSHDS

5:*MOVAX,0

6:*PUSHAX

7:*MOVDL,33H

8:*MOVAH,2

9:*INT21H

10:*RET

11:*STARTENDP

12:*CODEENDS

*e

(2)汇编

A>MASMSAM1

Microsoft(R)MacroAssemblerVersion5.10

Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.

50186+410435Bytessymbolspacefree

0warningErrors

0SevereErrors

(3)连接

A>LINKSAM1;

Microsoft(R)SegmentedExecutableLinkerVersion5.01.21

Copyright(C)MicrosoftCorp19841988.Allrightsreserved.

LINK:warningL4021:nostacksegment

(4)执行

A>SAM1

3

(5)在DEBUG下执行

A>DEBUGSAM1EXE

G

3

Programterminatednormally

Q

A>DEBUGSAM1.EXE

R

AX=0000BX=0000CX=000CDX=0000SP=0000BP=0000SI=0000DI=0000

DS=126EES=126ESS=16127ECS=127EIP=0000NVUPEIPLNZNAPONC

127E:00001EPUSHDS

U127E:010

127E:00001EPUSHDS

127E:0001MOVAX,0000

127E:0004PUSHAX

127E:0005MOVDL,33

127E:0007MOVAH,02

127E:0008INT21

127E:000BRETF

127E:000CINCBX

127E:000DOUT22,AX

127E:000FMOVBX,E743

Q

A>DEBUGSAM1EXE

G=0

3

Programterminatednormally

Q

A>

上例3.10中的汇编连接步骤也可由DOS批命令文件一次完成。方法是首先用行编辑建立如下批命令文件ASSEM.BAT,这里假设用户程序在B盘,而MASM及LINK文件在A盘。

A>

A>typeassem.bat

masm%1,,,,;

type%1.1st

erase%1.1st

cref%1;

type%1.ref

erase%1.ref

erase%1.crf

Link%1

然后在DOS提示符下执行该批命令。

B>A:ASSEMSAM

3.5用TASM运行汇编语言程序

Turbo汇编TASM是Borland公司推出的,可与Microsoft公司的MASM匹配的汇编语言软件。Turbo汇编语言程序可与TurboC、TurboPASCAL、TurboProlog及TurboBASIC语言程序方便地连接。用TASM调试汇编语言程序的步骤与MASM下的调试步骤基本相同。3.5.1TASM汇编语言程序的调试步骤

在TASM下调试汇编语言程序的步骤如图3-2所示:

3.5.2安装TurboAssembler由于TurboAssembler包含在BorlandC++软件包中,使用其中的INSTALLEXE程序即可完成安装。

TurboAssembler除包括TASMEXE,TLINKEXE外,还有下列文件:

·MAKEEXE单独运行的程序制作实用程序。多数程序中都包括许多源文件,这些程序在同其它程序连接之前,程序中的源文件可能有必要通过预处理、编译和其它处理。当已修改过模块或与模块相关的某些程序后,忘记了再编译将可能导致错误的发生,另一方面,你可以重新编译一遍所有的程序,这是非常安全可靠的,但是非常浪费时间。使用MAKE可以解决这种矛盾,MAKE通过检查文件上的描述部分和标识日期部分,识别哪些文件是经过了修改的,然后调用其它程序,诸如编译程序、汇编程序、连接程序和其它实用程序,生成新的目标文件、可执行文件,而对不需要修改的程序不做任何多余的处理。总之MAKE可对多个源文件的程序进行维护,有助于大型软件的开发。在此,对MAKE的具体操作不作进一步的介绍。

·TLIBEXETurbo库管理程序,相当于MASM中的LIBEXE。

·TCREFEXE相当于MASM中的CREF。

·THELPEXETurboAssembler的帮助实用程序。

·GREFEXE一种文件搜索实用程序,可以在几个文件中快速查找字符串。例如,想看看在哪个源文件中调用了setupmodem函数,可以执行下面的命令:

C>GREPSetupmodem*.ASM

在当前目录中的所有ASM里查找Setupmodem字符串,若找到则给出相应信息。

·OBJXREF.EXE目录模块交叉引用实用程序,可用来检查一系列目标文件和库文件,并生成有关这些文件内容的报告。一类报告里列出公用名的定义和对它们的引用,另一类报告是列出目标模块定义的段的长度。·TOUCH.EXE在使用MAKE时,若想要强制重编译或重创建一个特殊的目标文件,而该目标文件所依赖的源文件却没有改动时,可使用TOUCH来解决这一问题。TOUCH把若干文件的日期和时间改为当前的日期和时间,这样,运行MAKE就可重编译或重创建相应特殊的目标文件。

TOUCH允许DOS的通配符“*”和“?”。

3.5.3使用TASM进行汇编

使用TASM进行汇编后,必须用TLINK进行连接。TASM、TLINK与MASM、LINK的使用方法基本一致,但TASM、TLINK均提供了大量的命令行参数,有助于用户更好地完成编译和连接的工作。

键入下述命令:

C>TASM/h或

C>TASM/?

你会看到全屏幕的提示信息,这些信息描述了许多命令行选择项和用以定义要汇编的文件的语法。屏幕前两行显示如下:

TurboAssemblerVersion2.5Copyright(C)1988byBorlandInternational,Inc.

Syntax:TASM[optious]source[,object][,listing][,xref]

第一行为TASM的版本信息,第二行说明了TASM命令行选择项的语法。余下部分为参数说明,参数(options)项是任选的,以斜杠(“/”)加上参数表示,比如:

/h,/?Printthishelpscreen

参数选择项用以控制汇编方式。至于object文件、listing文件,xref文件均与MASM中的目标文件、列表文件、交叉汇编文件一致,其后缀名分别为OBJ、LST、XRF。

TASM允许同时汇编多个文件,文件名之间用加号“+”或空格连接,并且允许使用DOS通配符“*”和“?”。

C>TASM*

表示汇编当前目录下所有

ASM文件。

其常用命令行选择项简要介绍如下:

/a在目标文件中按字母顺序存放段,在源文件用ALPHA伪指令可完成同样的功能。

/b为处理兼容性而设置,不引起任何附加动作,对汇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论