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

下载本文档

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

文档简介

第3章汇编语言的运行方式本章从几个典型例子出发,通过上机实习,引导读者在DOS下学会使用DEBUG调试程序运行汇编语言程序;学会使用宏汇编MASM和Turbo汇编TASM运行汇编语言程序。并将系统地介绍

DEBUG的命令,以便在以后各章的学习中能够有一个熟练的调试和运行手段。使得读者在进入第5章以后能够一面学习汇编指令,一面积累设计、调试和运行完整的汇编语言程序的有关知识。使用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’INT

20H;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)运行程序-G3Program

terminated

normally如果现在想看一下机器指令是什么样子的话,方法之一是可以用反汇编命令U作如下操作:(4)反汇编-U100,108169C:0100B233MOVDL,33169C:0102B402MOVAH,02169C:0104CD21INT21169C:0106CD20INT20169C:0108(5)写COM文件-RBX

BX

0000:-RCX

CX

0000:8-N

EXCOM.COM-W送机器指令程序-E200

B2

33

B4

02

CD

21

CD

20执行机器指令程序-G=2003Pogram

terminated

normally退出DEBUG返回DOS,执行EXCOM-QCOM文件C>EXCOM3C>3.2 DEBUG命令DEBUG命令是在DEBUG提示符“-”下,由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数

之间,用空格或逗号隔开,操作参数与命令符

之间用空格隔开,命令的结束符是回车键

(ENTER)。命令及参数的输入可以是大小写的结合。Crtl+Break键可中止命令的执行。

Crtl+Num

Lock键可暂停屏幕卷动,按任一键继续。所用数均为十六进制数,且不必写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〈范围〉〈单元内容表〉

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

5BC:200

L

10

B2,′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执行后将该文件装入内存。例如:N

EXAMPLEL将当前盘上的EXAMPLE文件装入CS:100起始的一片内存单元。3.2.10内存搬家命令M格式:M

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

CS:100

110

600把从CS∶100起至CS∶110止17个字节搬至

DS∶600至DS∶610的一片单元。3.2.11命名待读文件命令N格式:N文件名说明功能:为L命令指定待装入文件注:其它形式参考DOS手册3.2.12端口输出命令O格式:O 〈端口地址〉 〈字节〉

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

2F

4F将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)显示指定存储器内容例如:R

AXR

F3.2.15搜索指定内存命令S格式:S 〈地址范围〉 〈表〉

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

110

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

11

41

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

功能:〈地址〉的缺省值是当前IP值,〈条数〉的缺省值是一条。执行由指定地址起始的、由〈条数〉指定的若干条命令。例如:T 执行当前指令并显示状态T

10 从当前指令始执行10H条指令3.2.17反汇编命令U格式:(1)U〈地址〉(2)U〈地址范围〉

功能:将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。3.2.18写盘命令W 格式:W 〈地址〉 〈盘号〉 〈起始逻辑扇区〉 〈所写逻辑扇区数n〉 功能:与L命令不同的地方是将内存〈地址〉起始的一片单元内容写入指定扇区。只有W而没有参数时,与N命令配合使用写盘文件。3.3

DEBUG命令综合使用例例3.2进入DEBUG,使用A命令将源程序写入内

存,使用G命令执行,再用U命令反汇编,接着用D命令显示后,用Q命令退出DEBUG,返回DOS提示符。

(1)进入DEBUG,并用A命令直接写入并汇编一个程序A>debug-A1001392:0100MOVDL,331392:0102MOVAH,21392:0104INT211392:0106INT201392:0108(2)执行该程序G3Program

terminated

normally(3)用U命令反汇编-U100

1081392:0100

B233MOV

DL,331392:0102B402MOVAH,021392:0104CD21INT211392:0106CD20INT201392:010861DB61(4)用D命令显示内存

D100

1081392:0100

B2

33

B4

02

CD

21CD

20

61.3...!.

a例3.3进入DEBUG,先显示200H处开始的一片单元,接着用E命令,将一段机器代码指令(就是上面的一段小程序)写入200~208H,然后执行,再用U命令反汇编。A>DEBUGD2001392: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!.@.!.@.!用E命令把代码指令写入内存E200

B2

33

B4

02

CD

21

CD

20

1B用G命令从200H开始执行

G=2003Program

terminated

normally(3)用U命令反汇编-U200

2081392:0200B233MOVDL,331392:0202B402MOVAH,021392:0204CD21INT211392:0206CD20INT201392:02081B00SBBAX,[BX+SI]-QA>例3.4 进入DEBUG,用A命令送程序,用R命令显示,并用T命令单条执行(1)进入并用A命令写入汇编源程序

A>DEBUGA1001392:0100MOVAH,31392:0102MOVAL,21392:0104ADDAL,AH1392:0106INT201392:0108(2)用R命令显示寄存器状态RAX=0000BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0100 NV

UP

EI

PL

NZ

NA

PO

NC1392:0100

B403

MOV

AH,03(3)用T命令单条执行TAX=0300BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0102NV

UP

EIPL

NZ

NAPO

NC1392:0102

B002MOVAL,02TAX=0302BX=0000CX=0000DX=0000SP=0000BP=0000SI=0000DI=0000DS=1392ES=1392SS=1392CS=1392IP=0104NV

UP

EIPL

NZ

NAPO

NC1392:0104

00E0ADDAL,AH(4)结果在AL中(AL)=5TAX=0305SP=0000DS=1392IP=0106BX=0000BP=0000ES=1392NV

UP

EICX=0000SI=0000SS=1392PL

NZ

NADX=0000DI=0000CS=1392PO

NC1392:0106CD02

INT20TAX=0305BX=0000

CX=0000DX=0000SP=0000BP=0000

SI=0000

DI=0000DS=1392ES=1392

SS=1392

CS=011CIP=1094NV

UP

DI

PL

NZ

NA

PO

NC011C:109490NOP用G命令接着执行 GProgram

terminated

normally退出QA>例3.5除以前接触过的命令外,下面还使用了整片搬家命令M,以及比较一片内存单元与另一片内存单元内容的命令C。(1)进入DEBUG,显示100H至110H内容

A>DEBUGD100

11061

031392:0100

0F

00

B9

8A

FF

F3

AE

471F

8B

C3

48

12

B1

.......Ga....H..1392:0110

04用F命令将31H装入100H至110H F100

110

31用D显示100H至117HD100

1171392:0100

31

31

31

31

31

31

31

31 31

31

31

31

31

31

31

311392:0110

31

8B

C6

F7

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

61,61,62,63(5)用D命令显示100H至110H的内容D1001101392:0100

31

311392:0110

3131

31

31

61

61

6263

31

31

31

31

31

31

31

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

200H至210HM100

110

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

31

311392:0210

3131

31

31

61

61

6263

31

31

31

31

31

31

31

11111aabc11111111(8)用E命令修改201H,202H,203H,20DH,20EH,20FH内容E201323134E20D414243(9)用D命令显示200H至210H内容及100H至110H内容D2002101392:0200

31

3231

34

316161626331313131414243

12141aabc1111ABC1392:0210

311D1001101392:0100

31

311392:0110

3131

31

316161626331313131313131

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

110

2001392:01031321392:02011392:010331341392:02031392:010D31411392:020D1392:010E31421392:020E1392:010F31421392:020F-QA>例3.6 以下是使用E命令和S命令的例子。E300′ABCDEFG′D300

3061392:0300

41

42

43

44

45

46

47ABCDEFGE310

1234′″D310

3151392:0310

27

31

32

33

34

27E320

31

32

33

41

42

43D320

3251392:0320

31

32

33

41

42

43′1234′123ABCS300

306

′D′1392:0303S310

315

′D′S310

315

′3′1392:0313S310

315

′1392:03101392:0315D310

3251392:0310

27

31

32

33

34

27

22

1341

AF

21

13

41

AF

21

13

′1234′″.A.!.A.!.1392:0320

31

32

33

41

42

43Q123ABC例3.7 以下用L命令将A盘目录读入内存。因为对双面双密软盘,盘目录区在0道0面6扇区,而L100

0

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

SerialNumberis0C6218C9Directory

ofA:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580bytes331776

bytes

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

100

0

0

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

db00169C:0B0045353220202020202020202000000000E52....169C:0B10000000000000BB8847150200871C0000........G.......169C:0B2045353320202020202020202000000000E53....169C:0B300000000000002F8A47150A003B0B0000....../.G...;...169C:0B4045353420202020202020202000000000E54....169C:0B50000000000000F68D47150D003E290000........G...>)..169C:0B6045392020202020202020202000000000E9....169C:0B700000000000006.....n.G.......-d169C:0B8045393220202020202020202000000000E92....169C:0B90000000000000BB9047151B0000060000........G.......169C:0BA045313020202020202020202000000000E10....169C:0BB0000000000000469147151D0002080000......F.G.......169C:0BC000000000000000000000000000000000................169C:0BD000000000000000000000000000000000................169C:0BE000000000000000000000000000000000................169C:0BF000000000000000000000000000000000................-qC>18C9(4)删除文件e9C>C>erase

a:e9C>dir

a:e9Volume

in

drive

A

has

no

labelVolume

Serial

Number

is

0C62Directory

of

A:\File

not

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

100

0

0

bdb00169C:0B0045353220202020202020202000000000E52....169C:0B10000000000000BB8847150200871C0000........G.......169C:0B2045353320202020202020202000000000E53....169C:0B300000000000002F8A47150A003B0B0000....../.G...;...169C:0B4045353420202020202020202000000000E54....169C:0B50000000000000F68D47150D003E290000........G...>)..169C:0B60E5392020202020202020202000000000.9....169C:0B700000000000006.....n.G.......(6)用E命令恢复字母Ee0b60

45d0b60

0b6f169C:0B604539202020202020(7)修改后写盘

w

100

0

0

bq2020202000000000E9....(8)可见已恢复C>dirVolumea:indriveAhasnolabelVolume

SerialNumberis0C6218C9Directory

ofA:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580

bytes334848

bytes

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

A:Volume

in

drive

A

has

no

labelVolume

Serial

Number

is

4555Directory

of

A:\E5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580

bytes785920

bytes

freeC>debugL100

0020d1f00169C:1F0045353220202020202020202000000000E52....169C:1F10000000000000BB8847150200871C0000........G.......169C:1F2045353320202020202020202000000000E53....169C:1F300000000000002F8A47150A003B0B0000....../.G...;...169C:1F4045353420202020202020202000000000E54....169C:1F50000000000000F68D47150D003E290000........G...>)..169C:1F6045392020202020202020202000000000E9....169C:1F700000000000006.....n.G.......18E4qC>del

a:e9C>dir

a:e9Volume

in

drive

A

has

no

labelVolume

Serial

Number

is

4555Directory

of

A:\File

not

foundC>debug-L

100

0

0

20-d1f00169C:1F0045353220202020202020202000000000E52....169C:1F10000000000000BB8847150200871C0000........G.......169C:1F2045353320202020202020202000000000E53....169C:1F300000000000002F8A47150A003B0B0000....../.G...;...169C:1F4045353420202020202020202000000000E54....169C:1F50000000000000F68D47150D003E290000........G...>)..169C:1F60E5392020202020202020202000000000.9....169C:1F700000000000006.....n.G.......e1f60

45d1f60

1f6f169C:1f60

45

39

20

20

20

20

20

20-w

100

0

0

20-q20

20

20

20

00

00

00

00

E9....18E4C>dir

a:Volume

in

drive

A

has

no

labelVolume

Serial

Number

is

4555Directory

of

A:\File

not

foundE5273031007905:05pE5328751007905:17pE54105581007905:47pE920501007906:03pE9217441007906:05pE1020501007906:10p6file(s)26580

bytes788480

bytes

free例3.9 利用DEBUG调试 EXE文件(1)程序清单及汇编连接步骤A>type

SAM.ASMCODESEGMENTASSUME

CS:CODEMOV

DL,33HMOV

AH,2INT

21HMOV

AH,4CHINT

21HENDSEND

STARTSTART:CODEC>MASM

SAM;microsoft(R)Macro

AssemblerVersion5.00Copyright(C)Microsoft

Corp19811985,1987.All

rights

reserved.51774+401858

Bytes

symbol

space

free0

warning

Errors0

Severe

ErrorsC>LINK

SAM;Microsoft

(R)

Overlay

Linker

Version3.60Copyright

(C)

Microsoft

Corp

1983

1987.All

rights

reserved.LINK:warning

L4021:no

stack

segmentC>SAM3C>DEBUG

SAM.EXEG3Program

terminated

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

SAM.EXELRAX=0000

BX=0000

CX=000A

DX=0000

SP=0000

BP=0000SI=0000

DI=0000DS=16AD

ES=16AD

SS=16BD

CS=16BD

IP=0000

NV

UP

EIPL

NZ

NA

PO

NCMOV

DL,3316BD:0000

B233-U16BD:0000

000816BD:0000

B23316BD:0002

B40216BD:0004

CD2116BD:0006

B44C16BD:0008

CD21G3MOV

DL33MOV

AH,O2INT

21MOV

AH,4CINT

21Program

terminated

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

SMA.EXERBX=0000

CX=000A

DX=0000

SP=0000

BP=0000

SI=0000ES=16AD

SS=16BD

CS=16BD

IP=0000

NV

UP

EI

PL

NZAX=0000DI=0000DS=16ADNA

PO

NC16BD:0000

B233

MOV

DL,33T=0BX=0000

CX=000A

DX=0033

SP=0000

BP=0000

SI=0000AX=0000DI=0000DS=16ADNA

PO

NCES=16AD

SS=16BD

CS=16BD

IP=0002

NV

UP

EI

PL

NZ16BD:0002

B402

MOV

AH,02TBX=0000

CX=000A

DX=0033

SP=0000

BP=0000

SI=0000AX=0200DI=0000DS=16ADNA

PO

NCES=16AD

SS=16BD

CS=16BD

IP=0004

NV

UP

EI

PL

NZ16BD:0004

CD21G3INT

21Program

terminated

normallyQ3.4用MASM(或ASM)运行汇编语言程序一个能经MASM(或ASM)汇编后运行的汇编语言源程序不同于在DEBUG下运行的汇编语言程序。首先在程序的书写方式上要加上逻辑段的说明,而且必须至少有一个逻辑代码段。其次一个书写正确的源程序必须经过源程序输入、汇编、连接后产生一个

EXE文件,才能作为DOS的外部命令在DOS下运行。小汇编(ASM)下的汇编语言程序可在64KB的内存条件下运行,且只能有限地使用伪指令。而宏汇编(MASM)下则必须在96KB以上的内存条件下运行,且可使用各种伪指令。本书中的例子均在MASM下通过。ASM和MASM的程序运行过程除汇编时用ASM代替MASM进行汇编外,其它步骤完全相同。3.4.1 MASM汇编语言程序的调试步骤在MASM下调试运行汇编语言程序的步骤如图3-1所示:3.4.2

典型实例下面通过几个典型例子说明汇编语言的运行步骤。例3.10 在MASM下运行与例3.1功能相同的程序,请读者务必注意二者在程序结构上的不同和运行方式的不同,具体步骤如下:(1)运行环境的准备一张操作系统盘,例如DOS

5

0一张汇编系统盘,应含如下文件:MASMLINKCREFEDLIN宏汇编程序文件连接程序文件

索引程序文件

行文本编辑程序一张已格式化的空盘,用以存储用户程序。准备好上述3张盘后应用DOS盘进入DOSA>(2)

利用任何文本编辑输入源程序,扩展名必须为 ASM。本例源程序文件名为SAM ASM。A>type

sam.asmCODESEGMENTASSUME

CS:CODESTART:

MOV

DL,33HMOV

AH,2INT

21HMOV

AH,4CHINT

21HCODEENDSEND

START(3)

汇编A>masmMicrosoft

(R)

Macro

Assembler

Version5.00Copyright

(C)

Microsoft

Corp

19811985,1987.All

rights

reserved.Source

filename

[.ASM]:samObject

filename

[sam.OBJ]:Source

listing

[NUL.LST]:samCross reference

[NUL.CRF]:sam50698+402

934

Bytes

symbol

space

free0

Warning

Errors0

Severe

Errors(4)连接

A>linkMicrosoft

(R)

Overlay

Linker

Version3.601987.Copyright

(C)

Microsoft

Corp

1983All

rights

reserved.Object

Modules

[.OBJ]:samRun

File

[SAM.EXE]:List

File

[NUL.MAP]:samLibraries

[.LIB]:LINK:warning

L4021:no

stack

segment(5)执行①直接执行

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

A>c:\dos\debugn

sam.exe1g3Program

terminated

normallyqReference

Untility

Version(6)产生索引表文件并输出A>crefMicrosoft

(R)

Cross5.00Copyright

(C)

Microsoft

Corp

1981

1985,1987.Allrights

reserved.Cross reference

[.CRF]:samListing

[sam.REF]:2

SymbolsA>type

sam.refSymbol

Cross

Reference(#definition,+modification)

Cref

1CODE.

.

.

.

.

.

.

.

.

.

.

.

.

.

1#298START.

.

.

.

.

.

.

.

.

.

.

.

.

3#2

Symbols(7)打印 LST清单文件和 MAP文件如下:A>type

sam.lst1

00002CODE

SEGMENTASSUME

CS:CODE3

0000B233START:MOV

DL,33H4

0002B402MOVAH,25

0004CD21INT21H6

0006B44CMOVAH,4CH7

0008CD21INT21H8

000ACODEENDSEND

START9Segments

and

Groups:N

a

m

e000ALength

Align

Combine

ClassPARA

NONECODE..............Symbols:Value

AttrCODESTART.............N

a

m

eL

NEARType0000TEXT

sam@FILENAME..........9

Source

Lines9

Total

Lines4

Symbols50698+402934

Bytes

symbol

space

free0

Warning

Errors0

Severe

ErrorsA>TYPE

SAM.MAPLINK:Warning

L4021:no

stacksegmentStart

Stop

Length

NameClass00000H

00009H

0000AH

CODEProgram

entry

point

at

0000:0000例3

11 汇编和连接可采取简单的办法。下面是完成与例3.10相同功能的程序的执行步骤。设源程序文件为SAM1.ASM。(1) 用行编辑输入源程序A>edlin

sam1.asmNew

file*i1:* CODE

SEGMENT2:* START

PROC

FAR3:* ASSUME

CS:CODE4:* PUSH

DS5:* MOV

AX,06:* PUSH

AX7:* MOV

DL,33H8:* MOV

AH,29:* INT

21H10:*

RET11:*START

ENDP12:*CODE

ENDS*e(2)汇编A>MASM

SAM1Microsoft

(R)

Macro

Assembler

Version5.10Copyright

(C)

Microsoft

Corp1981,1988.All

rights

reserved.50186+410435

Bytes

symbol

space

free0

warning

Errors0

Severe

Errors(3)连接A>LINK

SAM1;Microsoft

(R)

SegmentedLinker

Version

5.01.21ExecutableCopyright

(C)

Microsoft

Corp

19841988.All

rights

reserved.LINK:warning

L4021:no

stack

segment(4)执行A>SAM13(5)在DEBUG下执行A>DEBUGGSAM1

EXE3Programterminated

normallyQA>DEBUGSAM1.EXERAX=0000BX=0000

CX=000C DX=0000

SP=0000

BP=0000

SI=0000DI=0000DS=126EES=126E

SS=16127E

CS=127E

IP=0000

NV

UP

EI

PL

NZNA

PO

NC127E:0000

1EPUSH

DSU127E:0

10127E:00001EPUSHDS127E:0001MOVAX,0000127E:0004PUSHAX127E:0005MOVDL,33127E:0007MOVAH,02127E:0008INT21127E:000BRETF127E:000CINCBX127E:000DOUT22,AX127E:000FMOVBX,E743QA>DEBUG

SAM1

EXEG=03Program

terminated

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

assem.batmasm

%1,,,,;type

%1.1sterase

%1.1stcref

%1;type

%1.referase

%1.referase

%1.crfLink

%1然后在DOS提示符下执行该批命令。B>A:ASSEM

SAM用TASM运行汇编语言程序Turbo汇编TASM是Borland公司推出的,可与

Microsoft公司的MASM匹配的汇编语言软件。

Turbo汇编语言程序可与Turbo

C、TurboPASCAL、Turbo

Prolog及Turbo

BASIC语言程序方便地连接。用TASM调试汇编语言程序的步骤与MASM下的调试步骤基本相同。TASM汇编语言程序的调试步骤在TASM下调试汇编语言程序的步骤如图3-2所示:3.5.2

安装Turbo

Assembler由于Turbo

Assembler包含在Borland

C++软EXE程序即可完件包中,使用其中的INSTALL成安装。Turbo

Assembler除包括TASM外,还有下列文件:EXE,TLINK

EXE·MAKE

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

MAKE可对多个源文件的程序进行维护,有助于大型软件的开发。在此,对MAKE的具体操作不作进一步的介绍。·TLIB

EXE Turbo库管理程序,相当于MASM中的LIB EXE。相当于MASM中的CREF。Turbo

Assembler的帮助实用程·TCREF

EXE·THELP

EXE序。·GREF

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

Setupmodem

*.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/?你会看到全屏幕的提示信息,这些信息描述了许多命令行选择项和用以定义要汇编的文件的语法。屏幕前两行显示如下:Turbo

Assembler

Version

2.5

Copyright

(C)1988

by

Borland

International,

Inc.Syntax:TASM

[optious]source

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

this

help

screen参数选择项用以控制汇编方式。至于object文件、listing文件,xref文件均与MASM中的目标文件、列表文件、交叉汇编文件一致,其后缀名分别为 OBJ、 LST、 XRF。TASM允许同时汇编多个文件,文件名之间用加号“+”或空格连接,并且允许使用DOS通配符

“*”和“?”。C>TASM

*表示汇编当前目录下所有 ASM文件。其常用命令行选择项简要介绍如下:/a 在目标

温馨提示

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

评论

0/150

提交评论