计算机第五章 汇编语言程序开发_第1页
计算机第五章 汇编语言程序开发_第2页
计算机第五章 汇编语言程序开发_第3页
计算机第五章 汇编语言程序开发_第4页
计算机第五章 汇编语言程序开发_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

2二“

弟五章汇编语B程序开发

篇慧魂事珠编语言程序的开发过程。讲解各种汇编语

第一节.汇编语言程序一般开发过程.

汇编语言程序的一般开发过程如下图所示

汇编程序的开发过程为:

(1)利用文本编辑器(如记事本、EDITPLUS等)编辑一个扩展

名为ASM的汇编语言源程序。

(2)汇编(MASM)扩展名为ASM的汇编语言源程序,如有错误返

回步骤(1)进行修改;无错则至少生成一个扩展名为OBJ的浮

动目标文件。

(3)连接(LINK)扩展名为OBJ的浮动目标文件,如有错误返

回步骤(1)进行修改;无错则至少生成一个扩展名为EXE或COM

的可执行文件。

(4)利用调试工具(DEBUG)调试可执行文件,如有错误返回

步骤(1)进行修改;无错则结束。

(5)以上步骤周而复始,直至程序完全正确为止。

1.1开发汇编语言程序的工具

要开发汇编语言程序,需要准备下列的工具:

①编辑工具:为了建立源程序,可以使用可以找到的任何编辑程

序,如DOS环境下的EDIT;Windows环境下面的记事本、写字板、

WORD等,推荐使用EDITPLUS,支持语法着色,提供行号。

②汇编工具:可以使用ASM或MASM,ASM不支持宏汇编,若需要宏

汇编支持,使用MASM;MASM为微软公司提供,可以使用的最高版

本为8.0,推荐使用MASM6.X。

③连接工具:使用LINK,为微软公司提供。

④调试工具:使用Windows自带的DEBUG,用于调试16位CPU的汇

编程序;若要调试32位CPU的汇编程序,使用DEBUG32。

⑤其他:EXE2BIN可用于建立COM文件。

1.2建立ASM文件

开发汇编语言程序的第一步是建立汇编语言源程序。建立汇

编语言源程序应遵守汇编语言的语法规则:

①一行写一条汇编语言语句;

②汇编语言不区分对大小写;

③一个完整汇编程序最后语句一定是END伪指令,给出汇编程序

的运行时的起始地址;

④汇编语言中不能使用中文的标点符号,否则汇编的时会出现

umemoryoverflow”的错误;

⑤汇编程序中的数据占用的存储单元地址应在数据段中分配,指

令应放在代码段中,即汇编程序应采用分段结构进行组织;

⑥汇编源程序文件的后缀为.asm;

%。

1.汇编语言源程序段定义格式

在MASM6.X中可以使用两种段定义格式(MASM5.0开始的版本

提供这两种格式),即简单段定义格式和完整段定义格式。根据

段定义格式不同,汇编语言源程序编写可以采用两种结构,下面

通过例子说明汇编语言源程序的两种结构。

例:建立ASM文件:

编制汇编语言程序计算下面的公式,并把结果存放在FUN储

存单元中。io*(x+y)-3*(z-i)

r—

2

其中X,Y,Z的值分别存放在VARX,VARY,VARZ字储存单元

中,且假定计算过程的中间值和最后结果仍在16位二进制数的范

围内。

①.格式一简单段定义格式汇编语言源程序

NAMEWANGXIA01;定义模块名

.8086;设置CPIH:作模式

.MODELSMALL;定义存储器模式

.DATA;数据段定义伪指令

VARXDW123H;数据段内容

VARYDW456H

VARZDW789H

FUNDW?

.STACK20H;堆栈段定义,分配20H个字节存储单元

.CODE;代码段定义伪指令

START:MOVAX,©DATA;使用段地址宏@DATA初始化DS寄存器

MOVDS,AX

MOVAX,VARX

ADDAX,VARY

MOVBX,AX

SALAX,1

SALAX,1

ADDAX,BX

SALAX,1

MOVBX,VARZ

DECBX

MOVCX,BX

SALBX,1

ADDBX,CX

SUBAX,BX

SARAX,1

MOVFUN,AX

MOVAH,4CH;返回DOS系统

INT21H

ENDSTART;程序结束,标号START给出程序执行的起始地址

②.格式二完整段定义格式汇编语言源程序

NAMEWANGXIA02;定义模块名

.8086;设置CPU工作模式

DATASEGMENT;数据段定义

VARXDW123H;数据段内容

VARYDW456H

VARZDW789H

FUNDW?

DATAENDS;数据段定义结束

STACK1SEGMENTPARPSTACK;堆栈段定义

DW10HDUP(0);堆栈段分配20H个字节存储单元

STACK1ENDS;堆栈段定义结束

CODESSEGMENT;代码段定义

ASSUMECS:CODES,DS:DATA,SS:STACK1;段寻址

START:MOVAX,DATA;数据段初始化,代码段内容

MOVDS,AX

MOVAX,VARX

ADDAX,VARY

MOVBX,AX

SALAX,1

SALAX,1

ADDAX,BX

SALAX,1

MOVBX,VARZ

DECBX

MOVCX,BX

SALBX,1

ADDBX,CX

SUBAX,BX

SARAX,1

MOVFUN,AX

MOVAH,4CH;返回DOS系统

INT21H

CODESENDS;代码定义结束

ENDSTART;程序结束,标号START给出程序执行的起始地址

③说明:

I.在两种格式中NAME/TITLE伪指令用在源程序中给出模块名字,

可选,若没有使用NAME/TITLE伪指令,程序名为模块名;

II.在两种格式中.8086用于设置CPU工作模式伪指令;MASM6.X默

认的CPU工作模式为.8086,即MASM是以8086/8088工作模式来汇编

的。不论何种段定义格式,只要使用8086/8088以上的CPU提供的

指令时,必须使用设置CPU工作模式的伪指令来设置CPU的工作模

式。格式一典型示例中的设置语句为.8086;这个模式是CPU的默

认工作模式,可以省略设置CPU工作模式的伪指令有如下几种:

.8086;选择8086指令系统

.286;选择80286指令系统

.386;选择80386指令系统

.486P;选择80486保护方式指令系统

.486;选择80486指令系统

.586;选择Pentium指令系统

.586P;选择Pentium保护方式指令系统

II.定义存储器模式的伪指令.MODEL

简单段定义格式中,逻辑段是利用关键字定义的。由于数据

段和代码段可以有一个到多个,因此要求在程序一开始时就用定

义存储器模式伪指令来说明存储器模式。这条伪指令只用于简单

段定义格式。格式一典型示例中的设置语句为:

.MODELSMALL;MASM6.X不提供缺省的存储模式,必须说明存储

器模式

常用的存储器模式有:SMALL,TINY、LARGE,MEDIUM;

一般来说,除非程序很大或有特殊要求,大多使用Small存

储器模式,这样可省去程序中切换DS或CS的时间,程序执行速度

较快;段减少了,生成的可执行文件也会较小。使用Tiny模式时,

由于数据段和代码段公用一个64K字节的段,所以汇编后的程序

可以转换为COM文件。使用Large模式,可以在一个程序中定义多

个逻辑段作为DS或CS。

定义存储器模式伪指令只用在简单段定义格式中;

III.简单段定义伪指令

在简单段定义格式程序中,段定义伪指令有:

(l).CODE:表示代码段定义的开始,并在其后编写程序代码。

一个段的大小不能超过64KB。

(2).DATA:表示数据段定义的开始,并在其后组织并定义数

据。一个段的大小不能超过64KB。

(3).STACK:表示堆栈段定义的开始。后面的参数表示堆栈

段的字节个数,如省略,系统将堆栈段默认为1024个字节。

一个程序只能有一个堆栈段。

(4).当使用代码段或数据段不止一个时(Medium或Large模

式),可在指令后伴随段名称以示区别。如:

.CODEcodel

・CODEcode2

IV.简单段定义段地址宏

@CODE、@DATA和©STACK是由MASM提供的段地址宏,用在简

单段定义格式源程序中,程序汇编时会自动用相应的段地址取

代这些宏,对段寄存器进行初始化。如格式一典型示例中使用

的语句,

MOVAX,©DATA;将.DATA定义的逻辑段的段地址送AX寄存器

MOVDS,AX

段地址宏只能用在简单段定义格式汇编语言源程序中。在

完整段定义格式汇编语言源程序中,对段寄存器初始化方法是:

MOVAX,DATA

MOVDS,AX

V.完整段定义格式与简单段定义格式的不同之处在段定义格式上,

完整段定义格式中段定义伪指令是SEGMENT/ENDS。

VI.在完整段定义格式中,需要使用ASSUME伪指令,而简单段定义

格式中不需要;

VI.二者最后一条指令都只END伪指令。

2.汇编语言源程序返回DOS系统格式

执行汇编语言程序后一般要返回DOS系统,在汇编语言程序

中返回DOS系统的方法有两种。根据返回DOS系统的不同,汇编语

言源程序编写可以采用两种结构,下面通过例子说明汇编语言源

程序的两种结构。

例:建立ASM文件:

执行程序后输出“HELLOASM!”。

①返回DOS系统方法

namewx1;定义模块名

.8086;设置CPU工作模式

.modelsmall;定义存储器模式

.data;数据段定义伪指令

strldb'HelloASM!$C;数据段内容

str2dw'ab'

.stacklOOh;堆栈段定义伪指令,分配100h个字节存储单元

.code;代码段定义伪指令

mainprocfar;代码段子程序

start:pushds;保护断点地址

xorax,ax

pushax

movax,©data;初始化DS

movds,ax

leadx,strl

movah,9

int21h

ret;返回DOS系统

mainendp;代码段子程序结束

endstart;程序结束,标号START给出程序执行的起始地址

②返回DOS系统方法一

namewx2;定义模块名

.8086;设置cpin:作模式

datasegment;数据段定义伪指令

J-111TT111ACNArrbj

strlaoneiio1;数据段内容

dataends

codesegment;代码段定义伪指令

assumecs:data,ds:data

start:movax,data•初始化DS

movds,ax

leadx,strl

movah,9

int21h

movah,4ch•返回DOS系统

int21h

codeends

endstart•程序结束,标号START给出程序执行的起始地址

③说明:

I.以子程序方式返回DOS系统,格式:

namewx

.8086

.modelsmall

.data

.code

mainprocfar;代码段子程序

start:pushds

xorax,ax

pushax

ret;使用ret返回DOS系统

mainendp;代码段子程序结束

endstart

思考:执行ret如何返回DOS系统呢?

dos程序启动时,dos会为程序建立psp段,并且让ds指向该段,

ds:0处有一条指令int20h,它可以正确返回dos,但前提是执行该

指令时CS必须指向psp段,因此才有下面指令:

pushds

xorax,ax

pushax

retf

注意是retf,如果不想用retf,而用ret的话,应该将proc定为

far,才能正确返回。否则只会将0弹到ip中,实际上相当于

执行jmp0,又回到程序开始处,直到堆栈溢出。

因此,一般使用下贿指令退出,不用操心psp了。

movax,4cxxh(xx为退出码)

int21h

II.采用系统功能子程序方式返回DOS系统

namewx;定义模块名

.8086;设置CPU工作模式

.modelsmall;定义存储器模式

.data;数据段定义伪指令

.code;代码段定义伪指令.

start:...

movah,4ch;使用4cH号功能返回DOS系统

int21h

endstart

使用系统功能程序正常返回系统的方法有如下两种:

1.使用语句INT20H

功能:返回系统。

入口参数:CS指向程序段前缀(PSP)。一般用在COM文件中。

2.调用4cH号系统功能

功能:返回系统。

入口参数:AL二终止代码或无

格式:

MOVAH,4CH

INT21H或

MOVAX,4C00H

INT21H

3.ASM文件的格式

编写汇编语言源程序可以使用4种格式,分别是:

I.简单段定义子程序返回DOS系统;

II.简单段定义4cH号系统功能返回DOS系统;

III.完整段定义子程序返回DOS系统;

IV.完整段定义4cH号系统功能返回DOS系统;

t0

1.3汇编ASM文件生成OBJ文件(MASM)

建立汇编源文件(.ASM)后,需要使用宏汇编程序MASM对源

文件进行汇编,生成二进制的目标文件(・OBJ)。汇编过程中宏

汇编程序MASM对源程序进行两次扫描,第一次扫描要确定源文

件(・ASM)中每一行的偏移地址,扫描后提供一张符号表(或称标

识符表),记录源文件中定义的符号的偏移地址。第二次扫描生

成需要的OBJ、LST、CREF文件。

问题:思考MASM如何确定源文件(.ASM)中每一行的偏移地址?

使用记事本或EDITPLUA打开汇编后得到的.LST文件分析。

1.3.1汇编过程

使用MASM汇编ASM源文件的过程可以理解为:提供源文件

(.ASM)作为MASM程序的入口参数,执行MASM程序后,得到后缀

为.OBJ、.LST、.CREF的输出文件。

宏汇编程序MASM对ASM源文件进行两次扫描,主要完成的工

作是:

I.检查程序中各语句是否有语法错误。若有语法错误则给出错

误信息。语法错误有两种情况:警告错误(WarningError)和严

重错误(SevereError)o若有语法错误要求改正错误,否则不

能正确汇编。如没有错误,则完整汇编。

II.实现宏功能,若ASM源文件中有宏定义和宏调用,汇编程序

则完成宏展开。

III.生成目标程序(.0BJ)oMASM汇编程序把源文件(.ASM)中各指

令语句汇编成相应的目标代码,把数据定义语句中数据生成补

码形式表示的二进制数,分别为其分配存储单元,至此源文件

(.ASM)已转变成二进制文件。

汇编程序第一次扫描过程如下图:

第一次A清除地址计数器

读下一条源语句段名进入

符号表

清除地址

查找符号表测试操作码计数器

EQ11“DB/DW/DDtE.ND

SEGMENT

戈到?查找伪操作表修改

重分配存储单元

符号表

把变量或标号、戈到?

出地址计数器

地址计数器的值IN第二次

义增加长度值

及其它信息记入查找机器指令表

符号表

戈到?出错

操作码错误

计算指令长度

地址计数器增加

指令长度值

汇编程序第二次扫描过程如下图:

可青除地址计数帮I

读下一条源语句

测试操作码字段清除地址

计数器

查找伪指令表

SEGMENT

DB/DjV/DD

END

求操作数

结束汇编

查找机器指令表表达式值

过程

为定义储存单元

求操作数表达式值出错汇编初始值

确定段善存器阖

汇编机器指令

地址计数器增加

指令长度

1.3.2汇编程序(MASM)操作步骤

要汇编的源文件为wx2.asm,下面给出对该源文件进行汇编

的过程:

d:\masm〉iiiasmwx2.asm/

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

Objectfilename[wx2.OBJ]:/

Sourcelisting[NUL.LST]:wx2/

Cross-reference[NUL.CRF]:wx2/

50932+450604Bytessymbolspacefree

0WarningErrors

0SevereErrors

说明:表示回车键,带下划线的内容表示用户输入,

以与汇编程序进行交互。D:\masrn〉为汇编程序masm所在目录。另

外wx2.asm源文件默认的保存目录与masm汇编程序的保存目录一

样,若源文件与汇编程序masm的保存目录不相同,则在汇编的

时候应给出源文件所在目录路径,源文件的扩展名可以不用给

出,例如(设wx2.asm的保存目录是D:\):

D:\masm〉masmd:\wx2/:(汇编d盘根目录下源文件wx2.asm)

“5起念

汇编时,需要回答3次提问,可以输出3个文件:

I.Objectfilename[wx2.OBJ]:/

本次提问用于告诉用户对痴受件wx2.asm汇编后要生成名字

为wx2.obj的目标文件,默认保存在masm宏汇编程序所在目录;

若用户需要改变目标文件的名字以及目标文件的保存位置,则

在冒号(:)后面给出,例如:

d:\masm〉masinwx2/

Objectfilename[wx2.OBJ]:d:\wangxiao\/

说明:对源文件wx2.asm汇编,汇编后生成的目标文件wx2.obj

保存到d盘wangxiao文件夹中。

Objectfilename[wx2.OBJ]:d:\wcngxiLo\waegxiao/

说明:汇编后生成目标文件名字是wangxiao.obj,保存在

wangxiao文件夹中。

II.Sourcelisting[NUL.LST]:/

本次提问用于告诉用户对源文件wx2.asm汇编后是否需要生

成后缀为.LST列表文件,若需要则给出列表文件的名字;默认列

表文件保存在MASM所在文件夹中,若要改变列表文件的保存位置,

需要给出;若不需要列表文件则直接回车。

LIST列表文件:为一个程序清单,其把源文件中各语句与机

器语言目标代码一一对应列出,并给出程序中用户定义符号表。

例如:

d:\masm〉masmwx2/

Sourcelisting[NUL.LST]:/_

说明:对源文件wx2.asm汇编,不需要生成列表文件。

Sourcelisting「NUL.LST]:d:\wangxiao\wangxiao/

说明:汇编后生成列表文件,名字是wangxiao.1st,保存在

wangxiao文件夹中。

“5起念

III.Cross-reference[NUL.CRF]:/

本次提问用于告诉用户对源文件wx2.asm汇编后是否需要生

成后缀为.CRF交叉引用符号表文件,若需要则给出文件的名字;

默认文件保存在MASM所在文件夹中,若要改变文件的保存位置,

需要给出;若不需要交叉引用符号表文件则直接回车。

交叉引用符号表文件:列出源文件中用户自定义的各个符号

(如段名,过程名,常量名,变量名,标号等)在源文件中的定义

位置和引用这些符号位置。例如:

d:\masm〉masmwx2/

Cross-reference[NUL.CRF]:/

瓦以对源文件wx2.asm汇编,不需要生成交叉引用符号表文件。

Cross-reference[NUL.CRF]:d:\wangxiao\wangxiao/

说明:汇编后生成交叉引用符号表文件,名字是wangxiao.crf,保存在

wangxiao文件夹中。

使用CREF程序,可以把.CRF文件转换为.REF文件,然后打

开.REF文件查看程序中用户自定义符号定义及在程序中使用情

况。例如要把wx2.crf文件转换为wx2.ref文件,格式为:

d:\masm>crefwx2Z

Microsoft(R)Cross-ReferenceUtilityVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

Listing[wx2.REF]:/

9Symbols

说明:cref程序保存在d盘!nasm文件夹中,默认生成的.ref文件名字是wx2,

保存在cref程序所在文件夹中,若要改变,则需要给出,否则直接回车。

t0

1.3.3汇编结果分析

使用MASM宏汇编程序,输入ASM源文件,可以输出3种类型

文件,分别是・obj,.1st以及.crf,使用CREF程序,可以得到

第4种类型文件,其中.obj为必须文件,其余可以根据自己需要

选择。对前面wx2.asm汇编后生成的wx2.1st文件和wx2.ref文件

分别如下。

1

I..LST文件(wx2.1st)

1namewx2

2.8086

30000datasegment

4000048656C6C6F2041strldb?HelloASM!$,

5534D2124

6OOOBdataends

70000codesegment

8assumecs:code,ds:data

90000start:

100000B8Rmovax,data

1100038ED8movds,ax

1200058D610000Rleadx,strl

130009B409movah,9

14OOOBCD21int21h

15000DB44Cmovah,4ch

16000FCD21int21h

170011codeends

18endstart

Microsoft(R)MacroAssemblerVersion5.007/4/5Symbols-1

说明:这部分用于说明源文件中各语句汇编处理结果,分4部分

来理解:第一部分最左边数字1—18为行号,后面紧接数字

0000—0011(16进制数)表示存储单元偏移地址,该偏移地址指

向存储单元中保存该行第4部分指令经汇编后得到目标代码;第

3部分为目标代码,第4部分为源文件中语句。

SegmentsandGroups:

NameLengthAlignCombineClass

CODE0011PARANONE

DATA000BPARANONE

说明:这部分说明源文件中用户定义的逻辑段情况,分别给出源

文件中定义各段名(NAME)、大小(LENGTH)以及相关属性。注意此

时的逻辑段还没有与CPU内部段寄存器关联。

Symbols:

NameTypeValueAttr

STARTLNEAR0000CODE

STR1LBYTE0000DATA

©FILENAMETEXTwx2

17SourceLines

17TotalLines

6Symbols

49904+451632Bytessymbolspacefree

0WarningErrors

0SevereErrors

说明:这部分给出源文件中用户自定义的符号相关情况,有符号

名,符号类型(TYPE),符号取值(VALUE)以及符号寻址段寄存器

(ATTR)o最后还对源文件进行了总结。

II..REF文件

MicrosoftCross-ReferenceVersion5.00MonJul0400:58:212005

SymbolCross-Reference(#definition,+modification)Cref-1

CODE7#817

DATA3#6810

START9#18

STR14#12

4Symbols

说明:该REF文件给出了用户在源文件中自定义的所有符号相关

情况,在文件中数字表示源文件中语句行号,带行号表示符

号定义的行号,其余表示访问该行号的语句行号。

自此,经汇编后源文件(.asm)中符号语句转换成二进制数

据保存在目标文件(・obj)中。

L3.4汇编有关问题

I.“向前引用”的问题

汇编语句中的操作数若使用变量或标号,有两中情况:

①若使用的变量或标号是已经定义的,称向后引用;

②若使用的变量或标号还没有定义,即定义在使用之后,称向前引用;

问题:汇编程序在汇编源程序时,需要对汇编的语句分配存储单元,

分配的存储单元大小与操作数的类型有关,而操作数的类型与定义变

量或标号时规定的类型有关,则对于向前引用在语句中使用变量或标

号时,变量或标号还没有定义,则该语句需要分配的存储单元的大小

如何规定?

例如:JMPGO

若标号GO是向前引用,汇编程序在汇编到该语句的时候就不知道标号

GO的类型是FAR还是NEAR或SHORT?对于此情况,汇编程序一般用NEAR

属性作为缺省类型(不一定正确哦⑥)。则对于类似向前引用的问题在

使用变量或标号的时候记得规定其类型以免发生错误。

例:JMPFARPTRGO;JMPSHORTGO

基于上述原因,在汇编语言源程序中数据段应该放在代码段的前面,

以保证代码段中使用的变量后向引用。

II.“浮动地址”的问题

对源程序汇编过程中,当汇编到段定义语句时,地址计数器的值

被置为3其后本段内所有偏移地址都在0地址的基础上进行递增,

可以理解为一个段所分配的存储单元的偏移地址均为相对于0地

址而言的相对地址,即程序中所有段地址都为0。在把一个程序

装入存储器时,由于存储单元中0地址的存储单元由系统占用,

则用户程序中的各个段并非开始于0地址,而是开始于某个非0地

址,即段地址要在0地址的基础上“浮动”某个值,该值要在连

接(LINK)的时候才能确定。可以理解为在段中中定义的变量或标

号都是浮动地址,若程序中指令的操作数是变量或标号,则汇编

该指令后得到表示目标代码二进制数值为浮动值,在该二进制值

后加R表示“浮动”。

例:movax,data或leadx,strl

思考:上述两条指令的目标代码有什么不同?

①movax,data二进制代码不确定;

②leadx,strl二进制代码确定,但含浮动地址;

1.4连接OBJ文件生成可执行文件(LINK)

源文件经汇编生成.obj目标文件,.obj目标文件需要经过连

接(LINK)操作,才能转换成可执行程序(.exe/.com)。此外若一个

程序由多个模块组成,也要使用连接(LINK)操作连接多个模块,

以处理各个模块之间共有变量或符号。

思考:计算机可以理解执行二进制文件,汇编后得到的.OBJ

文件已经是二进制文件,为什么还需要对.OBJ文件进行连接(LINK)

操作?

I.汇编(MASM)源文件(.ASM)后得到的.OBJ目标文件中存在浮动地

址,必须在连接的时候才能其取值情况,称再定位。

II.若一个程序由多个模块构成,则需要对多个模块连接(LINK),

整合成一个整体装入模块。

L4.l连接过程

使用LINK连接.OBJ文件的过程可以理解为:提供目标文件

(・OBJ)作为LINK程序的入口参数,执行LINK程序后,得到后缀

为.EXE、.MAP的输出文件。

连接程序LINK对OBJ目标文件进行连接,主要完成的工作有:

①确定程序中定义的各个段的段地址值;

②确定各段中汇编程序不能确定的偏移地址值;

③连接程序个模块形成一个整体装入模块(如果有);

1.4.2连接程序(LINK)操作步骤

要连接的目标文件为wx2.obj,下面给出对该目标文件进行

连接的过程:

D:\masm>linkwx2.obi/

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp1983-1987.Al1rightsreserved.

RunFileFWX2.EXE1:/

ListFile[NUL.MAP]:wx2/

Libraries[.LIB]:/

Warning:NoSTACKsegment

说明:表示回车键,带下划线的内容表示用户输入,以

与汇编程序进行交互。D:\masm〉为连接程序link所在目录。另外

wx2.obj目标文件默认的保存目录与link连接程序的保存目录一

样,若目标文件与连接程序link的保存目录不相同,则在连接

的时候应给出目标文件所在目录路径,目标文件的扩展名可以

不用给出,例如(设wx2.obj的保存目录是D:\):

D:\masm〉linkd:\wx2/:(连接d盘根目录下目标文件wx2.obj)

连接过程需要回答3次提问,以与LINK程序进行交互:

I.RunFile[WX2.EXE]:/

本次提问用于告诉用户对目标文件wx2.obj连接后要生成名

字为wx2.exe的可执行文件,默认保存在link连接程序所在目录;

若用户需要改变生成的可执行文件的名字以及保存位置,则在

冒号(:)后面给出,例如:

d:\masni>linkwx2/

RunFile[wx2.EXE]:d:\wangxiao\/

说明:对目标文件文件wx2.obj连接,连接后生成的可执行文件

wx2.exe保存到d盘wangxiao文件夹中。

RunFile[wx2.EXE]:d:\wangxiao\wangxiao/

说明:连接后生成可执行文件名字是wangxiao.exe,保存在

wangxiao文件夹中。

II.ListFile[NUL.MAP]:/

本次提问用于告诉用户对目标文件wx2.obj连接后是否需要

生成后缀为.MAP列表文件,若需要则给出列表文件的名字;默认

列表文件保存在连接程序LINK所在文件夹中,若要改变列表文件

的保存位置,需要给出;若不需要列表文件则直接回车。

MAP列表文件:又称连接映象文件,给出源程序中定义的各

个段在存储器中分配情况。

例如:

d:\masni〉linkwx2/

ListFile[NUL.MAP]:_/

说明:对目标文件wx2.obj连接,不需要生成MAP列表文件。

ListFile[NUL.MAP]:d:\wangxiao\wangxiao/

说明:汇编后生成MAP列表文件,名字是wangxiao.map,保存在

wangxiao文件夹中。

11jLibraries[LIB]•

.本次提问用于杳饰用户对目标文件wx2.obj连接是否需要提

供后缀为.LIB的库文件,若需要则给出库文件的名字,不需要库

文件则直接回车。默认库文件应保存在LINK所在文件夹中,否则

需要给出库文件的保存位置;

例如:

d:\masm>linkwx2/

Libraries「.LIB]:/

说明:对目标文件wx2.obj连接,不需要提供库文件。

Libraries[.LIB]:d:\wangxiao\wangxiao/

说明:连接需要库文件,库文件名字是wangxiao.lib,保存在wangxiao文件

夹中。

1.4.3连接结果分析

使用LINK连接程序,输入OBJ目标文件,提供LIB库文件

(若需要),可以输出2种类型文件,后缀分别是・exe和.map,

其中.exe为必须文件,其余可以根据自己需要选择。对wx2.obj

连接后生成的wx2.map文件如下所示:

LINK:warningL4021:nostacksegment

StartStopLengthNameClass

00000H0000AH0000BHDATA

00010H00020H00011HCODE

Programentrypointat0001:0000

MAP文件内容说明:

①MAP文件中首先是一个无堆栈段警告(warning),此警告不影响

程序执行;

②MAP文件中第二部分是用户自定义各段在程序中起点、终点以

及各段长度。

③MAP文件中最后给出执行程序时的入口地址,该地址在源程序

中由END定义符号规定。

1.4.4连接有关问题

I.多个模块连接

一个程序由多个模块组成,可以对各个模块进行汇编(masm),然后在

使用连接程序(link)把汇编得到的各个模块进行连接,组合成一个完

整的可执行程序。对多个模块进行连接操作格式为:

d:\masni>link模块1+模块2+.../

说明:

①连接后生成的可执行程序默认名字与第一个模块名相同;

②各模块文件可以是汇编语言汇编后生成的目标文件(.obj),也

可以是其他高级程序设计语言经编译后生成的目标文件(.obj);

思考.

5各个模块在连接时如何进行再定位?

由段定义语句中组合类型和类别属性规定。

②各个模块之间如何进行变量传递?

由public和exter伪指令说明。

1.5运行与调试可执行文件

至此,汇编语言源程序经汇编和连接操作后,生成可执行文件,

可执行文件后缀为.exe。运行可执行文件,可以得到程序的运行

结果;对可执行文件进行调试,可以观察文件执行过程中的各条

语句的运行结果。

1.5.1运行可执行文件

对源多华wx2.asm汇编、连接后,生成可执行文件为

wx2.exe,运行wx2.exe过程如下:

D:\masm>wx2.exe/

HelloASM!

D:\masm>

说明:表示回车键,带下划线的内容表示用户输入,此

处输入为要运行的程序名,后缀.exe可以省略不写。"Hello

ASM”为运行可执行文件的输出结果。D:\masm〉为程序wx2.exe所

在目录。执行可执行文件后,系统返回DOS,从该意义上讲,可

以把wx2.exe看着是DOS系统的一个子程序。

1.5.2调试可执行文件

运行可执行文件,可以得到该文件的输出;若要观察可执

行文件运行过程中个语句的执行结果,则需要进行调试。对可

执行文件进行调试,可使用DEBUG调试程序。在DEBUG状态下,

可以使用寄存器名字指定CPU内部的各个寄存器,以修改或查看

寄存器的当前值;使用逻辑地址指定存储单元,逻辑地址表示

为段地址:偏移地址,段地址可以使用CPU内部的段寄存器或4位

16进制数(即16位二进制数)给出,偏移地址用4位16进制数给出。

另外在DEBUG状态下,所有数值数据以16进制方式给出,数值数

据不必以H结尾,而A—F开头的16进制数可以不用(不能)加0开

头。

所有DEBUG命令可以有一个、多个参数或没有参数,多个

参数之间用空格或逗号分界符隔开,所有命令都一回车键结束。

DEBUG命令不区分大小写。

yn&ed证由

I.DEBUG的使用

①DEBUG的启动:

进入DOS状态下,键入DEBUG,按ENTER键,如:

C:\>DEBUG/,则屏幕显示:

符号“一”是进入DEBUG的提示符,在该提示符下可键入任意

DEBUG命令。

②DEBUG的退出:

在DEBUG的提示符后输入Q命令,按ENTER键,则退出DEBUG返回

DOSo即:

—Q/

③DEBUG的使用:

在DEBUG的提示符后输入DEBUG命令,按ENTER键。即格式为:

一DEBUG命令/

II.常用DEBUG命令介绍

★A命令

格式:A[地址]

功能:将指令直接汇编成机器码输入到内存中。

参数说明:[地址]指定存放键入汇编语言指令的内存单元的位置。

A命令使用

说明:用于小段程序的汇编及修改目标程序,所有输入的数字均

默认为十六进制,并且不需要以“h”字符结尾。用户装入内存的

汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇

编命令,该语句被汇编到CS:0100区域,则在它上次停止处开始

汇编。

注意:壬扁I扇

1.直接在A命令下输入跳转指令时,跳转指令后应跟跳褒到

的语句所在内存单元的地址,不能跟标号;使用跳转指令时,可

以指定跳转指令的属性:near,far。near前缀可以缩写为ne。-a

0100:0100

0100:0100jmp102

0100:0102jmpnear105

0100:0105jmpfar10a

2.汇编语言指令所涉及到的操作数可以是字操作数也可以是

字节操作数,在语句不能判别操作数的类型时,可以使用前缀

wordptr或者前缀byteptr指定操作数的类型。缩写分别是:wo

和by。

-a0100:0100

0100:0100decwordptr[100]

0100:0102decwoptr[100]

0100:0105decbyteptr[100]

在DEBUG下,应注意区分立即操作数和内存地址的操作数,使

用包括在中括号(口)中的操作数表示内存地址。

★D命令

格式:D[地址]或D[起始地址][目的地址]

功能:以内存映象方式显示内存中的数据。

参数说明:指定要显示内容的内存单元的起始地址和结束地址,或起始地址

和长度。如果不指定[地址],Debug将从以前d命令中所指定的地址范围的末

尾开始显示128个字节的内容;第一次从DS:100处开始显示。

D命令使用

说明:当使用d命令时,Debug分两个部分显示内存单元内容:左边显示内

存单元中存放的十六进制数;右边显示左边的十六进制所表示的ASCII字符,

所有不可打印字符用句号(.)表示。每行显示16个字节的内容,在第八和第九

个字节之间有一个连字符。

从键盘键入下面命令:

-dcs:10010f

Debug按以下格式显示地址范围中的内容(假定CSRAF6):

0AF6:010077616E677869616F-696A6BFF0E0001FFwangxiaoijk….

键入以下命令,Debug将从CS:100开始显示20h个字节的内容:

-dcs:100120

键入以下命令,Debug将显示范围从DS段的100h到115h中所有字节的内容:

-d100115

注意:在D命令中若不指定段寄存器,默认规定为DS。

★E命令

格式:E[地址][字节串]或E[地址]

功能:从指定的地址开始修改内存值。

参数说明:[地址]指定存放[字节串]第一个内存的位置,[字节串]是要放入内

存单元中的数据。

E命令使用

说明:当使用E命令时,有两种使用格式:

用E命令中包含的字节串替换从指定的地址开始的多个字节的内容;

E命令后不跟字节串,则允许按顺序方式显示和修改内存值,按下空格键显示

下一字节内容,若想修改,直接输入相应值;按下减号键显示上一字节内容,

若想修改,直接输入相应值。

停止执行e命令。按ENTER键。在任何字节位置都可以按ENTER。

]丰•

1.心鲁地址部分只输入偏移量,则E命令认为段包括在DS寄存器中。

[字节串]的值可以是十六进制字节或字符串。使用空格、逗号或制表符来

分隔值。必须将字符串包括在单或双引号中。

使用E命令后,内存单元中原来的数据将丢失,或者说被新输入的数据覆

盖。

从键盘键入下面命令:

-E100

Debug按下面的格式显示第一个字节的内容(假定DS=0AF6):

0AF6:0100EB.

要将该值更改为61,请在插入点键入(使用符号表示)61,如下所示:

0AF6:0100AB.61_

此时,若按下空格键,将显示下一个内存单元中的内容:

0AF6:0100AB.61EF._

此时,又可以在插入点键入新的内容,改写当前显示的内存内容,若不需要改写

当前内存单元的内容,可以直接按下空格键,将显示下一个内存单元的内容,

如此,一直到按ENTER停止e命令并返回到Debug提示符下。

若使用减号键,操作和按下空格键一样,区别在于将显示上一个内存单元的

内容。

注意:使用该种方法,只能键入16进制数,不能键入字符串。

从键盘键入下面命令:

-EDS:100EF'ABC'41

则执行上面的命令后,从DS:100内存单元开始的5个连续的字节中的内容将被

数据0EFH,字符“"?加£”的八5(:11码和数据4是替换。

★G命令

格式:G[=起始地址][[断点]……]

功能:执行正在调试的程序,当达到断点时停止执行,并且显示

寄存器标志和下一条要执行的命令。

参数说明:匚起始地址]指定当前在内存中要开始执行的指令所在

的内存单元的地址。如果不指定匚起始地址],DEBUG将从CS:IP

寄存器中的当前地址开始执行程序。[[断点]……]指定可以设

置为g命令的部分的1到10个临时断点。

G命令使用

说明:G命令中的=不能省略,可以只给出偏移地址,默认段地

址为当前的CS;若省略=,则该地址就成为G命令中的断点地址。

程序将从指定的开始地址不停的执行程序,一直到遇到结束指令

为止,并显示“Programterminatednormally”。断点地址只对本次

G命令有效;下一条G命令若需要断点地址,应重新进行指定。当

使用G命令执行程序到断电地址后,显示断点地址处的指令和寄

存器的内容。

注意:断点地址应为一条指令在内存单元中的首字节地址。

★R命令

格式:R[寄存器]

功能:1.显示单个寄存器的内容,并提供修改功能。2.显示所有

寄存器内容,再加上字母标志位状态以及要执行的下一条指令。3.显

示8个标志位状态,并提供修改功能。

参数说明:[寄存器]指定要显示其内容的寄存器名。

R命令使用

说明:可以使用的寄存器名有:AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、

SS、CS、IP、PC及F。键入R命令不跟任何可用的寄存器名,则将显示所有的

寄存器的内容以及CS:IP指向的存储单元中的内容;若键入R命令指定了寄存

器名称,将以十六进制数形式显示该寄存器中的内容,下一行显示冒号提示

符,在冒号提示符后面可以为寄存器键入新的数据。若不需要修改寄存器的

数据,直接按ENTER键返回Debug提示符。如果键入f字符代替寄存器名,

Debug将每个标记的当前设置显示为两字母代码,然后显示Debug提示符。

要更改标志的设置,请从下表中键入适当的两字母代码;若不需要修改,直

接ENTER键返回Debug提示符。可以修改全部或部分标志位,可以按任何顺

序键入新的标志值。不需要在这些值之间留出空格。任何没有指定新值的标

志保持不变。

£

在DEBUG下,标志位表示如下:

标志名标志为1标志为0

OFOVNV

DFDNUP

IFEIDI

SFNGPL

ZFZRNZ

AFACNA

PFPEPO

CFCYNC

要只查看标志的状态,键入以下命令:

-RF

将按如下格式显示:

NVUPDINGNZACPENC-

此时可以按任意顺序键入一个或多个有效的标志值,其中可以有或没有空格,

如下所示:

NVUPDINGNZACPENC-PLEICY

执行指令后,将使用新的标志位数值代替旧值。

“5起念

要查看当前所有寄存器的取值、所有标志位的内容和CS:IP指向的内存单元指

令,键入以下命令:

一R

如果当前位置是CS:1692,显示外观将类似于以下内容:

AX=OOOOBX=OOOOCX=OOOODX=OOOOSP=OOOOBP=OOOOS1=0000DI=0000

DS=0AF6ES=0AF6SS=0AF6CS=0AF6IP=1692NVUPEIPLNZACPONC

0AF6:1692BA2601MOVAX,0126

从键盘上键入如下命令:

-RCX

执行后,将显示:

CX0000

在冒号后可以位CX键入新值,若不需要改变,直接按ENTER。

注意:若输入的寄存器名不在上面的有效寄存器名之内,将显示:

bferror

R命令后只能跟一个有效的寄存器名。修改标志位如果指定没有在前面的表中

列出的标志代码,将显示:

bferror

若为一个标志位指定了多个值,Debug将显示以下消息:

dferror

★T命令

格式:T[二地址][指令条数]

功能:逐条跟踪程序的执行,每条指令执行后都将显示各寄存器

的内容。

参数说明:[二地址]指定第一条要执行指令的位置。如果不指定

地址,则默认地址是在CS:IP寄存器中指定的当前地址,[指令

条数]指定在将控制返回给Debug之前要执行的指令数,默认值

为lo

T命令使用

说明:通常采用跟踪一条指令,但用户也可以用指令条数设定一

次跟踪多条指令,每执行一条指令之后,显示所有寄存器的内容

和标志状态以及下一条指令在内存中的保存情况。T命令若不跟匚

地址]参数,则从当前CS:IP处开始执行,第一次键入的T命令从

CS:100处开始执行程序。T命令默认段寄存器为CS。

键入下面得到命令:

-T

若是第一次执行,则显示:

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000S1=0000DI=0000

DS-0AF6ESRAF6SS=0AF6CS=0AF6IP=0103NVUPEIPLNZACP0NC

0AF6:0103BA2601MOVAX,0126

若要从CS:200处开始执行程序,则键入下面的命令:

T=CS:200

★U命令

格式:u[起始地址]或者[地址范围]

功能:将内存中的内容转换为汇编语句。

参数说明:[起始地址]或者[地址范围]指定要反汇编代码的起始地址和结

束地址,或起始地址和长度。

U命令使用

说明:u命令中如果没有使用参数,第一次使用,贝Uu命令从CS:IP开始对

20h个字节内容进行反汇编;若不是第一次使用,则从前面U命令所显示地

址后的第一个地址开始开始对20h个字节内容进行反汇编。

若要从CS:100开始反汇编8(10h)字节,键入下面命令:

-uCS:100108

程序执行后,显示下面的结果:

0AF6:010021725FAND[BP+SI+5F],SI

0AF6:0103C606E3991AMOVBYTEPTR[99E3],1A

0AF6:0108C3RET

1.5.3COM可执行文件

COM文件也是一种可执行文件,由程序本身二进制代码组成,

没有EXE文件包含的有关文件信息的标题区,所占用存储单元比

EXE文件小。COM文件不允许分段,其占用存储单元不能超过64K,

即COM文件所有语句应包含在一个不大于64K的段中。

COM文件源程序格式如下:

title/nameXXX;给出源程序名字

equ伪指令;定义程序需要的常数

progsegment;定义段prog并与CPU内部段寄存器关联

assumecs:prog,ds:prog,es:prog,ss:prog

orglOOh;COM文件入口点

mainprocnear

start.

.;初始化;第一条指令为指令语句,不能是伪指令

;程序代码

;返回DOS

mainendp

;datadefine

progends

endstart

说明:

COM文件是只有一个段(不超过64KB)的可执行文件,其入

口地址必须是100H。其内容只有程序本身,不附加任何其他信

息。系统装入COM文件时,直接将其载入内存的某个未用的段中,

并自动将程序段前缀(PSP)作为程序的一部分载入程序占用内

存段的前256字节中。因此COM文件所占用存储单元段的前256字

节保留给PSP。在COM文件中所有段寄存器值均指向PSP所在的段

(也是程序所在的段),初始化时(IP)=100H,(SP)

二0FFFEH,栈顶存储单元内容为字0。

建立了COM源文件后,经汇编、连接生成EXE文件,对生成

的EXE文件,可以使用EXE2BIN程序建立COM文件,格式为():

d:\masni>exe2bin文件名.exe文件名.com/

在上面的格式中,第一个文件名是已经生成的exe文件名,后

缀.exe可以省略,第二个文件名为要生成的com文件名,后

缀.com不能省略。若省略后缀,则生成后缀是.bin文件。

此外,在debug状态下,可以使用W命令直接建立.com文件。

对于MASM5.0以上版本,也可用如下格式:

;title/name

.modeltiny

.code

orglOOh

start:jmpbegin

;数据定义

;代码

movax,4c00h

int21h

endstart

例:完整段定义,编写程序输出'hello.asm!5

titlehello,asm;标题

codesegment;定义段

orglOOh;定位程序入口地址为100H

assumecs:code,ds:code,ss:code

start:jmpcodel

strdb'hello.asm!Oah,Odh,$;数据定义

codel:movax,code;^movax,segstrl

movds,ax

leadx,str

movah,9

int21h

movah,4ch

int21h

;数据定义也可以放在此处

codeends

endstart

对前面程序编hello,asm可以汇编连接生成exe后,用exe2bin

生成.com文件。

或用debug手动制作:

debuga.exe

na.com

rex;这时将原ex值减去100H后在保存在ex中。

w

q

则将

温馨提示

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

评论

0/150

提交评论