計算機第五章 匯編語言程序開發_第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

提交評論