第05章匯編語言程序設計_第1頁
第05章匯編語言程序設計_第2頁
第05章匯編語言程序設計_第3頁
第05章匯編語言程序設計_第4頁
第05章匯編語言程序設計_第5頁
已閱讀5頁,還剩118頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

會計學1第05章匯編語言程序設計1.方式選擇偽指令(續)以下三條偽指令是MASM6.12引入的:.686——用于匯編PentiumPro到Pentium4微處理器非特權(實模式)指令.686P——用于匯編PentiumPro到Pentium4微處理器保護方式在內的所有指令.MMX——用于匯編MMX指令.K3D——用于匯編AMD微處理器3DNOW!指令。是MASM6.13引入的.XMM——用于匯編SSE和SSE2指令。是MASM6.15引入的2.完整的段定義使用完整的段定義偽指令來定義一個段,可具體控制匯編程序MASM和連接程序LINK在內存中組織代碼和數據的方式。

整個邏輯段必須用段定義語句括起來。(1)SEGMENT——ENDS偽指令<段名>SEGMENT[定位類型][組合方式][段長度][分類名]

{段體}<段名>ENDS每個邏輯段都以SEGMENT語句開頭,以ENDS語句結束;

兩語句前的段名作為邏輯段的標識符,它必須是唯一的,確定該段在存儲器中的位置。

第1頁/共123頁(1)SEGMENT——ENDS偽指令(續)段開始和結束語句之間部分是段的內容——

對數據段、堆棧段和附加段而言,一般由存儲單元定義、分配等偽指令所組成,對代碼段,則主要是由可執行指令以及某些偽指令組成。方括號中是定位類型、組合方式、分類名和段長度等的說明,視情況可以省略。若對本邏輯段在內存中的定位加以限定、或需與其它段相連接,則須按規定選擇這些項。定位類型(Align-type)規定該段的起始位置。有以下幾種選擇:

BYTE:段的起始地址可以從任何單元開始,段間不留空隙,存儲器利用率最高;

WORD:段的起始地址為偶數,即從字的邊界開始;適合字類型的數據段定位;

DWORD:段的起始地址是4的整數倍,適合雙字類型的數據段定位;PARA:段的起始位置是16的整數倍,即從節(24=16為一節)的邊界開始;

PAGE:段的起始地址必須是256的整數倍,即從頁(28=256為一頁)的邊界開始;

INPAGE:該段長度不超過256個字節(一頁之內),不允許跨頁存放。定位類型缺省時為PARA方式。第2頁/共123頁(1)SEGMENT——ENDS偽指令(續)組合方式(Combinetype)又稱連接方式,規定連接程序LINK處理本段與其它邏輯段時如何進行相互連接。可以有以下幾種:

NONE:本段與其它段無組合關系,這是缺省方式。也可用等價的關鍵字

PRIVATE。PUBLIC:在滿足定位的條件下,將本段與其它具有PUBLIC屬性的同名段連接

成一個連續的大邏輯段,公用一個段基址;連接次序由連接命令指定。

COMMON:本段和其它具有COMMON屬性的同名段重疊,對各段指定相同的

起始地址(即段基址),因而產生復蓋。COMMON連接后段的長度是

各連接段中最大段的長度。

STACK:把不同模塊中具有STACK屬性的同名段連接成一個連續的堆棧段,連

接后的堆棧空間是被連接的各個堆棧空間之和。LINK自動將新段的段

基址送SS,將新段的長度送SP;定義堆棧段時沒有將其說明為

STACK類型,就要在程序中用指令給SS和SP賦值;連接程序LINK在

連接時會給出一個警告信息。

MEMORY:早期版本的選項,LINK不再單獨區分MEMORY類型,將其視為

PUBLIC類型,MASM允許它繼續使用,主要是為了與支持Intel

MEMORY類型的連接程序兼容。

AT<表達式>:定位本段在指定節的整數邊界上,節號由表達式給出。AT方式

不能用在代碼段中。使用AT方式的邏輯段中,用DB、DW預置

數據將失敗。第3頁/共123頁(1)SEGMENT——ENDS偽指令(續)段長度

對32位微處理器新增了USE屬性說明,又稱段字說明。

對16位CPU,默認的段長是16位,不使用USE選項。

對32位CPU,有兩種方式(默認選項是USE32):USE16:表示邏輯段最大長度為64K,訪問該邏輯段采用16位尋址方式。USE32:表示邏輯段最大長度為4G,訪問該邏輯段采用32位尋址方式。分類名

用單引號括起來的長度不超過40個字符的字符串。連接程序把不同模塊中分類名相同的段組織成一類,存放在連續的存儲區域。習慣上數據段/代碼段/堆棧段的分類名分別用’DATA’/’CODE’/’STACK’表示。第4頁/共123頁(2)段分配語句ASSUME段分配偽指令ASSUME用來通知匯編程序:CS、DS、SS、ES將被設置成那些段的段基址寄存器,這樣在匯編時就能知道語句中引用的變量和標號是通過那些寄存器進行訪問的。ASSUME<段寄存器名>:<邏輯段名>[,<邏輯段名>…];[<段寄存器名>:<邏輯段名>

[,<邏輯段名>…];…;[<段寄存器名>:NOTHING]]偽指令語句ASUMENOTHING將刪除所有已設置的段寄存器與段名之間的關聯。ASUME偽指令只是建立段名和段寄存器之間的關聯,并未把各個段的段基址裝入相應的段寄存器中。段基址的裝入通常采用程序方法。①DS和ES裝入:在程序中用指令經通用寄存器間接裝入段基址。②SS裝入:有兩種方法——

◆一種是在SEGMENT語句的組合類型中選用STACK,在ASSUME語句中建

立堆棧段與SS的關聯,則連接時LINK自動給SS和SP賦予正確的初值;

◆另一種SEGMENT語句中組合類型未選用STACK參數,或者程序中使用了

另一個堆棧段,可用傳送指令間接地給SS和SP賦初值(組合類型未選用

STACK參數,連接時LINK會給出警告信息)。③

CS和IP裝入:對CS和IP,通常是按照結束偽指令END[<起始地址>]

指定的地址來自動完成段基址和偏移地址裝入的。第5頁/共123頁(3)組定義偽指令GROUP當用段定義語句SEGMENT—ENDS定義了若干個邏輯段而總容量不超過64K時,就可把這些段用GROUP語句定義為一個“組”,格式如下:<組名>GROUP<段名1>[,段名2,……]GROUP把程序模塊中若干個不同名字的段組合成一個組,并賦予一個組名,組內各段都裝在一個物理段中,使組內各段間的跳轉都視作段內跳轉。語句中的段名可以是表達式SEG<變量名>或SEG<標號>,表達式的值是定義該變量或標號的段號。語句中的段名可以是表達式SEG<變量名>或SEG<標號>,表達式的值是定義該變量或標號的段號。

組名是標識組的起始地址的標號,表示該組的段基址。組中各個段內的偏移地址都以這個基址為起點,而不以本段原來的段基址為起點。組名的使用方法與段名相同。第6頁/共123頁3.定位語句(1)ORG語句匯編源程序時,匯編程序將段名填入段表,并為該段配置一個位置計數器(初值為0),該計數器依次累計段內語句被匯編后所生成的目標代碼的字節數,跟蹤匯編過程。

偽指令ORG能改變這個位置計數器的值,從指定位置分配代碼或數據。格式:

ORG<數值表達式>數值表達式中可用“$”表示位置計數器的當前值,表達式的值為正整數;ORG語句把表達式的值賦給位置計數器。

在代碼段,ORG語句后的指令語句就從指定位置生成目標代碼;

在數據段,ORG后的數據定義偽指令就從指定位置分配所定義的數據。(2)EVEN語句格式:

EVENEVEN語句使段內位置計數器當前值$與偶地址對齊。

遇到EVEN語句時,若地址計數器值$為奇數,在代碼段匯編程序自動插入一條單字節空操作指令NOP,使$變為偶數;在數據段自動將$值加1,使下面定義的數據從偶地址單元開始存放。第7頁/共123頁4.模塊開始與結束語句(1)模塊開始語句模塊開始語句Name表示源程序的開始并為模塊取名字,格式如下:

NAME<模塊名>匯編程序將以語句中的模塊名作為模塊的名字。

也可使用title語句,格式:

TITLE<標題>title偽指令指定了在每一頁上打印的標題,最多為60個字符。如果程序中沒有使用NAME偽指令,則匯編程序MASM將用title語句中標題的前6個字符作為模塊名。如果程序中既無NAME語句,又無TITLE語句,則將用源文件名作為模塊名。(2)模塊結束語句ENDEND表示源程序到此結束,并可指出程序的啟動地址。格式如下:

END[標號/過程名]該語句一般放在源程序最后一行,程序中有且只能有一個END語句。其中標號或過程名給出了程序開始執行的啟動單元地址,只有主模塊才可有此選項。◆當連接的多個模塊中都沒有給出啟動地址,將從代碼段的第一個字節

處開始執行,

◆當有多個模塊都指定了啟動地址,將從最后一條帶標號的END語句指

定的啟動地址單元開始執行。

這些都可能導致程序的錯誤執行,編程時應予避免。

第8頁/共123頁5.返回操作系統方式

(1)使用功能號為4CH的DOS功能調用調用方式:

MOVAH,4CH ;功能號4CH送AH寄存器

INT21H ;DOS系統功能調用這是最有效且兼容性最好的返回DOS方式。(2)將主程序定義為遠過程在代碼段中,將主程序定義為遠過程,由RET語句返回。 <主過程名>

PROCFAR

…;{主程序}

RET <主過程名>

ENDP(3)利用20H號BIOS中斷調用這種方式只能用于擴展名為.COM的可執行文件。調用方式為:

INT20H(4)利用0號DOS系統功能調用該方式與INT20H一樣,只有在.COM類型的文件中才可使用。調用格式如下:

MOVAH,0 ;功能號送AHINT21H ;DOS系統功能調用第9頁/共123頁5.1.2段定義的簡化

在MASM5.0及以上版本中,段的定義可以非常簡單,方便了程序設計。使用簡化段定義偽指令前,必須先說明用戶程序使用的內存模式。1.內存模式定義偽指令MODEL內存模式指用戶程序的代碼和數據的存放格式,及他們占用內存的大小。

.MODEL<存儲模式>[,語言類型][,操作系統類型][,堆棧類型]①

存儲模式:共有七種——TINY——微型模式。

程序中的代碼和數據放在同一個64KB段內,程序為*.COM型,該模式是MASM

6.0才引入的。SMALL——小型模式。

這是一般程序的默認模式。程序中的代碼和數據各放入一個64KB的段內,數據段、

堆棧段和附加段一起共用一個段。對代碼和數據的訪問通過近程調用(NEAR)

來實現。MEDIUM——中型模式。

程序中代碼長度大于64KB,可安排在不同的段內;數據存放在一個64KB的段內;

因此代碼訪問是遠程(FAR)的,數據訪問是近程的。COMPACT——壓縮模式。

程序中所有代碼安排在一個64KB的段內,數據區可大于64KB,安排在不同的段

中(但任一數據段存儲空間不得超過64KB)。對代碼訪問是近程的,對數據訪問

是遠程的。第10頁/共123頁1.內存模式定義偽指令(續)LARGE——大型模式。

程序中的代碼和數據都超過64KB,但靜態(常數)數據限制在64KB之內;對代碼和數據的訪問默認都是遠程的。HUGE——巨型模式。

程序中的代碼和數據均大于64KB,靜態數據也可以超過64KB。對代碼、數據和數組的訪問都是遠程的。FLAT——平展模式。

DOS下不能使用此模式。該模式用于創建32位的Windows程序,只能運行在32位的80x86微處理器上。②語言類型子程序語言類型用來告訴匯編程序使用什么樣的標識符命名風格、子程序調用和返回約定等。語言類型說明可使匯編程序和其他語言程序共享。有效的語言類型為C、SYSCALL(系統調用)、STDCALL(標準調用)、BASIC、FORTRAN、PASCAL等。③操作系統類型OS_DOS是當前唯一支持的選項也是該選項的缺省值。④堆棧類型堆棧類型有如下兩個選項,不同選值主要影響偽指令.STARTUP所生成的指令序列。NEARSTACK——堆棧段和數據段是同一個段。這也是該選項的缺省值。FARSTACK——堆棧段和數據段是不同的段,且堆棧段不在段組DGROUP中。第11頁/共123頁2.簡化的段定義

(1)簡化段定義偽指令簡化段定義偽指令在.MODEL<存儲模式>語句之后,如下所列。

每個簡化段偽指令都可用來表示一個段的開始,同時也說明前一個段結束。.STACK[長度] ;定義堆棧段,長度缺省值為1KB.CODE[名字] ;定義代碼段.DATA ;定義數據段.DATA? ;定義數據段,初值不確定.FARDATA[名字] ;定義遠調用數據段.FARDATA?[名字] ;定義遠調用數據段,初值不確定.CONST ;定義只讀常數數據段.STARTUP ;程序起始點,并初始化DS、SS.EXIT0 ;程序結束點,返回操作系統上述簡化段定義偽指令中帶方括號的項可省略。

偽指令.EXIT0相當于MOVAX,4C00H和INT21H兩條指令。

第12頁/共123頁(2)缺省段名使用簡化的段定義偽指令,每個段都有一個缺省的段名,如下表所示。第13頁/共123頁2.簡化的段定義(續)(3)等價段名MASM5.0宏匯編語言中規定了幾個代替真實段名的等價段名,允許用@代替簡化段定義偽指令前的小數點。如@CODE代表.CODE定義的段名,@DATA代表.DATA、.DATA?、.CONST和.STACK共享的組名,@FARDATA代表.FARDATA定義的段名,等等。(4)定義段序偽指令MASM可以對匯編結果的目標文件中各段的位置進行排序。

定義段序的偽指令有三種。.SEG——按照段在程序中出現的順序對之排序。

這是完整段定義格式中的默認順序。.ALPHA——按照字母順序對段排序。.DOSSEG——按照DOS定義的標準段序。

即按代碼段、數據段、堆棧段的次序對段排序。這是用.MODEL偽指令

的簡化段定義格式中默認的順序。

第14頁/共123頁3.源程序編程格式

(1).EXE文件編程格式該格式下源程序允許使用多個邏輯段,適合編寫大型程序,匯編-連接后生成擴展名為.EXE的可執行文件。

.EXE文件編程格式的源程序最少有一個代碼段。

代碼段的開始用一條ASUME語句設置段約定。在實模式下,每個邏輯段的目標模塊最大64KB;

在保護模式下,80286不超過16MB,32位的80x86不超過4GB。.ASM源程序匯編、連接后生成可執行文件.EXE,.EXE文件有重定位信息。

DOS裝入.EXE文件,再根據重定位信息完成對目標模塊的重定位,然后在目標程序的上方(低地址處)自動生成256個字節的程序段前綴PSP(ProgramSegmentPrefix),DOS通過PSP管理用戶程序(如程序結束時返回DOS的途徑等)。DOS自動使DS=ES=PSP的段基址,FS=GS=0,CS:IP指向用戶程序的啟動地址,SS:SP指向用戶堆棧的棧頂。

然后DOS把控制權交給用戶程序。由于DOS給DS、ES、FS、GS所賦的初值不等于用戶程序數據段、附加段的段基址,因此用戶程序開始處必須對所用的段寄存器DS(及ES、FS、GS)等進行初始賦值。第15頁/共123頁3.源程序編程格式(續)(2).COM文件編程格式該格式只允許源程序設置一個代碼段(堆棧在代碼段內),代碼段的目標模塊要小于64KB,適合編寫中小程序。

在.MODELTINY偽指令定義的內存模式下即可生成.COM結構的源程序。程序中使用的數據可集中設置在代碼段的開始或末尾,程序的啟動指令須設置在代碼段內偏移量為100H的單元處。.COM文件沒有重定位信息,比.EXE文件要小得多。

DOS裝載.COM文件時也在用戶程序上方生成256個字節單元的程序段前綴PSP,PSP開始處存放一條中斷指令INT20H(2個字節)。

DOS自動賦值使CS=DS=ES=SS=PSP的段基址、FS=GS=0,使IP=100H、SP=FFFEH,然后把控制權交給用戶程序,CPU從CS:100H處開始執行用戶程序。DOS在裝入.COM文件時自動在用戶區高端(高地址處)設置堆棧,.COM文件編程不需要設置堆棧。常見可執行文件的執行級別從高到低依次是.COM、.EXE、.BAT。

可用EXE2BIN.EXE軟件將匯編-連接生成的小于64K的.EXE文件轉換成.COM文件:

EXE2BIN<文件名[.EXE]><文件名.COM>前一個文件名后綴.EXE可省略,但后一個文件名的后綴.COM必須寫上,否則將生成.BIN文件(它不能裝入執行)。用高版本匯編TASM.EXE匯編.ASM文件后,只需在連接(TLINK.EXE)時使用小寫的“t”做連接參數就可直接生產.COM文件。

第16頁/共123頁5.2匯編語言語句

5.2.1匯編語言匯編語言是面向機器的程序設計語言,是為特定的計算機系列設計的,使用英文宿寫的指令助記符、符號地址及標號等編寫程序語句。與其它程序類似,匯編語言源程序由語句行構成。1.匯編程序匯編程序的種類很多,主要功能基本相同:把匯編語言源程序翻譯成二進制代碼,但匯編的處理器指令集和偽指令語句集有所不同。

◆Microsoft公司的MASM宏匯編程序應用最廣,有多種版本,版本越高

功能越全;

◆基本匯編程序ASM只能匯編8086/8088指令源程序,ASM是MASM的

一個子集,它不支持有關結構、記錄、宏、條件匯編等偽指令和偽操

作符。

第17頁/共123頁2.語句分類

構成匯編源程序的語句可分為兩大類:指令性語句和指示性語句。指令性語句就是指令語句,是CPU要執行的語句部分。

指令語句由匯編程序匯編、翻譯成目標代碼,一條指令語句對應一條機器語言指令代碼,規定機器的一種操作。指示性語句不是計算機系統指令集提供的,因此又稱為偽指令。

每種匯編程序都有自己的偽指令集,偽指令主要作用是為匯編程序服務,告訴匯編程序如何翻譯指令語句、以及如何分配內存、定義數據、進行各種有關的處理(替換、條件匯編、連接、列清單等等)。

偽指令匯編時由匯編程序執行,不產生機器代碼。第18頁/共123頁3.語句結構

指令性語句:[標號:] <助記符>[操作數][;注釋]

指示性語句:[名字] <定義符>[操作數][;注釋]<……>尖括號內的為必選項,[……]方括號內的為可選項。(1)標號和名字指令性語句中的標號后一定要跟冒號,而指示性語句中的名字后不能有冒號,這是兩種語句在格式上的主要區別之一。標號在代碼段中設置,表示本語句的符號地址,可作為轉移指令或Call指令的目標地址,因而標號只出現在作為目標而被訪問的語句中。名字可以是變量名、段名、過程名、符號名等,語句中是否出現名字及出現什么名字取決于定義符的要求。標號或名字可由下列字符組成:

英文字母(匯編程序一般不區分大小寫)、數字0~9以及_$.?@%等。

除數字外的字符都可以作為第一個字符出現,若使用“.”符號則必須出現在開頭位置。

組成標號或名字的字符可以有多個,但只有前31個被匯編程序識別和承認。第19頁/共123頁(2)助記符和定義符指令語句中的助記符表示該指令的操作碼類型,規定了語句的操作功能,如ADD、LOOP等。

偽指令中的定義符規定了該語句的偽操作功能,由匯編程序進行處理。除了注釋語句外,助記符或定義符是匯編語句中必不可少的項目。(3)操作數操作數項可以是常數、寄存器、標號、變量或者表達式。

操作數項的多少由指令或偽指令規定,在一項以上時,各項之間用逗號分開。

對指令語句,操作數項通常給出操作數的地址,一般不超過2個;

對偽指令語句,該項則給出所需的參數,可以有多個。(4)注釋注釋以分號開始,用來對一段程序或某些指令在程序中的作用加以說明,增加程序的可讀性。注釋不被匯編程序匯編,也不被執行。一條語句一般只占一行,超過一行要用續行符“&”指明。兩條語句不能寫在同一行上。匯編源程序語句最多由四個部分組成;書寫時各部分之間要留有一定數量的空格,以使各語句的相應部分全部左對齊,使整個程序規范整齊,清晰明了。第20頁/共123頁5.2.2數據定義語句

1.變量定義語句用變量表示存儲器數據,是匯編語言中普遍采用的方法。

變量名是存放數據的存儲單元符號地址,變量值是對應存儲單元的內容。(1)語句格式格式一:[變量名]<定義符><數據項表>[;注釋]格式二:[變量名]<定義符><常數表達式>DUP(<數據項表>)[;注釋]變量名是可選項,表示符號地址,標記該語句數據項表中第一個數據的偏移地址,變量的值就是該偏移地址單元的存儲內容。定義符是必選項,用來定義數據項的類型屬性,常用的有以下幾種:DB——定義字節,項表的每個數據項為字節,類型屬性為1;DW——定義字,項表的每個數據項為字(2個字節長),類型屬性為2;DD——定義雙字,項表的每個數據項為雙字,類型屬性為4;DF——定義長字,項表的每個數據項為三字(48位二進位),類型屬性為

6,僅用于386CPU上的指針變量;DQ——定義四字,項表的每個數據項為四字,類型屬性為8;DT——定義十個字節,項表的每個數據項為十字節,類型屬性為10。

第21頁/共123頁(2)變量定義語句例舉

DBYTE DB10,-10,10HDWORD DW100,-100,100HDDW DD4*20,0FFFDH;變量匯編存儲結果見下圖左

MESSAGE0DB`HELLO'MESSAGE1DB`AB'MESSAGE2DW`AB‘;變量匯編存儲結果見下圖中

BUF1DB0,?,?,?,0;“?”操作數可預留空間,不存入數據BUF2DW?,36,?;變量匯編存儲結果見下圖右第22頁/共123頁用地址表達式定義變量地址表達式的運算結果是一個地址(無符號數),指向某個存儲單元;該存儲單元若用來存放數據,則為變量,若存放指令代碼,則為標號。

可以用已有確定值的變量或標號來定義一個新的變量顯然只能使用DW或DD來定義。

DW用來將已知變量或標號的偏移地址定義為新變量,

DD用來將已知變量或標號的偏移地址和段基址分別置入新變量的低位字和高位字中。設程序中已定義了變量V1和V2,代碼段中已定義了標號FIRS和LLT,則可用它們來定義新變量如下:

NV1DW FIRS ;把標號FIRS的偏移地址賦給字變量NV1NV2DD LLT ;把標號LLT的偏移地址和段基址賦給雙字變量NV2NV3DW V1 ;把變量V1的偏移地址賦給字變量NV3NV4DD V2 ;把變量V2的偏移地址和段基址賦給雙字變量NV4格式二用復制操作符DUP(Duplicationoperator)來復制或重復定義變量;

其中<常數表達式>的值應是一個正整數,用來規定DUP后括號中數據項表的重復次數。

ARRAY1DB2DUP(0,10,10H,?);等價于ARRAY1DB0,10,10H,?,0,10,10H,?ARRAY2DW100DUP(?)DUP操作可以嵌套:TAB1DB2DUP(1,2,3DUP(10)) TAB2DW10DUP(5DUP(2DUP(1100H,2200H)))上面第一條語句定義了TAB1開始的10個字節單元,其內容為1,2,10,10,10,1,2,10,10,10;

第二條語句定義了TAB2開始的200個(10×5×2×2)字單元,其內容為1100H,2200H重復2次(4個字單元)、再重復5次(5×4=20個字單元)、再重復10次(20×10=200字單元),TAB2數組有200個字單元,占400個字節存儲空間。(3)變量類型屬性變量被定義后具有相應的值,還具有類型屬性,變量表達式的類型屬性和變量相同。匯編程序用類型屬性來表明指令操作數的字節長度。指令在執行運算時,操作數作為參加運算的對象,其類型屬性必須相同,否則出錯。第23頁/共123頁2.標號

標號表示指令性語句的符號地址,作為轉移類指令的目標操作數,一目了然地確定程序轉移的目標地址。(1)標號屬性段屬性(SEG)

表示標號所在段的段基址。偏移屬性(OFFSET)

表示標號在段內的偏移地址(從段基址到標號位置之間的字節數),是16位或32位無符號數。距離屬性(TYPE)

也叫類型屬性,指出標號被訪問的段別:

近程NEAR——只允許在本段內被訪問的標號,

指令性語句標號之后必須有一個冒號,這個標號的默認屬性為NEAR。遠程FAR——允許其它段跨段訪問的標號。標號也可以作為過程定義語句的過程名,用作調用指令的目標地址。(2)更改屬性的偽指令標號和變量,其屬性可用PTR偽指令臨時指定,用THIS和TABLE偽指令另行指定。第24頁/共123頁2.標號(續)PTR屬性操作符格式:<類型>PTR<變量或標號[±常數表達式]>其中變量類型可以是BYTE、WORD、DWORD等,標號類型可以是NEAR或FAR。PTR臨時指定某個變量、標號或地址表達式所指存儲單元的類型或距離屬性,使其具有語句左邊的<類型>屬性(與原定義的不同)。例: BUF3DB 1,2 BUF4DW3456H,7890H… MOVAX,BUF3+1 ;出錯,操作數類型不匹配

MOVBL,BUF4 ;出錯,操作數類型不匹配匯編程序在匯編這段程序時,發現兩條MOV指令的類型屬性不同:第一條MOV指令AX為字類型而BUF3+1為字節類型,第二條MOV指令BL為字節類型而BUF4為字類型,因而出錯并提示:(這兩條指令)操作數類型不匹配。用PTR運算符改變它們的屬性,改正如下:

BUF3DB 1,2 BUF4DW 3456H,7890H … MOVAX,WORDPTRBUF3+1;5602H送AXMOVBL,BYTEPTRBUF4;56H送BL第25頁/共123頁2.標號(續)THIS屬性運算符格式:

THIS<類型>THIS運算符常與偽指令EQU、=連用,為當前存儲單元定義一個指定類型的變量或標號。THIS不分配新的存儲單元。例: BUF EQUTHISWORD POT EQUTHISFAR第一(或第二)條語句表示從本語句開始,變量BUF(或標號POT)的類型屬性就定義為字(或FAR),而不管BUF(或POT)原來的類型是什么,直到遇到新的類型定義語句為止。LABLE偽指令LABEL語句用來給變量或標號取一個別名,并可重新定義它的類型屬性。這使得同一個變量或標號以不同的名字引用時具有不同類型的屬性。格式:<名字>LABEL<類型>被LABEL定義的名字,其位置與緊跟在該語句下面的指令(變量定義偽指令或帶標號的指令)具有相同的段基址和偏移地址。例:BARRAY LABELBYTEDARRAY DW100DUP(?) MOVBRRAY+2,0 MOVDARRAY+2,0BARRAY和它下面的DARRAY的地址是相同的,它們指向同一數組。BARRAY被定義成字節型,第一條MOV指令把該數組的第3個字節置0;DARRAY被定義成字類型,第二條MOV指令把該數組的第3個字(即第4和第5個字節)置0。第26頁/共123頁3.符號定義語句

為方便程序設計,對程序中多次出現的同一個常量、字符串或表達式,可以用符號定義偽指令賦予一個符號名;也可給某些符號取新的名字并賦予新的類型屬性。符號定義語句不占用內存。(1)等值語句EQU格式:<符號名>EQU<表達式>表達式可以是數值、地址、新類型屬性或其它符號名,

EQU將左邊的符號名賦給表達式,使它們完全等價。在程序中可方便地用符號名代替表達式。例:

PORT1EQU20HPORT2EQUPROT1+1BUF_SIZEEQUPORT2*2COUNTEQUCX;COUNT代表CX寄存器

B8EQU[BP+8];B8代表地址引用[BP+8]CHAREQU‘C’CBDEQUDAA;CBD代表指令助記符DAA

…DECCOUNT;將CX寄存器內容減1第27頁/共123頁3.符號定義語句(續)(2)等號語句=等號語句功能與EQU語句相同,但是等號語句定義的符號名在程序中可重新定義,并且表達式只能是數值表達式。例:

DAT=100 ;DAT定義為100 COUNT=DAT+10 ;COUNT定義為110 LLP=3 ┆ COUNT=COUNT-20 ;重新定義COUNT為90 DAT=200 ;重新定義DAT為200LABLE可定義新的符號并賦予不同的屬性;THIS、PTR可和EQU、=等偽指令連用,賦給新定義的符號以不同的屬性。第28頁/共123頁4.常量

常量又叫常數,在匯編時有確定的值,一般在程序執行過程中不再改變。常量主要用于偽指令語句中給變量賦值,也用做指令中的立即數或存儲器操作數的組成部分。常量可用數值形式直接寫在指令語句中,也可預先為它定義一個名字保存在存儲單元內。數值常量——常用作語句操作數項中的常數,可以是二、八、十六或十進制數,分別在數值末尾加“B”、“Q”(或“O”)、“H”和“D”標記。

數尾不加標記的,匯編程序默認作十進制數。偽指令RADEX可以把默認的基數改變為2~16范圍內的任何基數:.RADIX<基數表達式>其中基數表達式的結果為2~16之間的十進制整數,用來表示基數值。下面兩組指令是等價的:

MOVBX,0FFH .RADIX16MOVCX,178 MOVBX,0FF MOVCX,178D第29頁/共123頁4.常量(續)字符常數

是保存在單引號或雙引號內的ASCII字符串。

定義多于2個字符的字符常數,必須用DB偽指令;

僅有1或2個字符,用偽指令DW、DD、DQ、DT都行。浮點常數

用十進制數科學計數法表示,如

SINEDD0.538E-1。十六進制實常數

與十六進制常數相似,但第一個字符必須是數字(0~9),數尾緊跟字母R,而且其位數必須是8、16或20。

HRNUMBDD0BAEF1234R5.表達式和運算符

表達式:用運算符連接變量、標號、常量等數據形式的式子。

表達式可作為語句中的數據項,由宏匯編程序進行計算,將所得結果作為指令的操作數,執行指令所規定的操作。

表達式的計算在匯編時完成,指令的運算在程序執行過程中完成。表達式的結果是一個數值則稱為數值表達式,結果是一個存儲單元的地址時則稱為地址表達式。地址單元中存放的是數據則稱為變量,地址單元中存放的是指令則稱為標號。第30頁/共123頁MASM宏匯編程序中的表達式由操作符和操作對象組成,允許使用的操作符有六種類型,可進行算術運算、邏輯運算、關系運算、回送運算、修改類型屬性運算與專用運算等。如下表所示。第31頁/共123頁MASM對方括號的地址表達式有如下的規定:①只有基址寄存器BX、基址指針BP、變址寄存器SI和DI可以出現在[]內。②BX或BP可單獨出現在[]內,也可單獨與SI或DI以及常數一起出現在[]內;但BX和BP不允許同時出現在[]內。③SI或DI可單獨出現在[]內,也可單獨與BX或BP以及常數一起出現在[]內;但SI和DI不允許同時出現在[]內。④一個[]內含基址和變址寄存器時,它們只能做加法運算;相加的基址和變址寄存器可以寫在兩個相鄰的[]內。⑤當[]內包含基址指針BP時,約定的段基址由堆棧段寄存器SS提供,否則均隱含使用數據段寄存器DS。⑥相加的常數可以寫在[]之外。⑦方括號內還可以是表達式,其值表示數組變量的下標。第32頁/共123頁5.2.3結構化數據定義

MASM宏匯編還支持有關結構、記錄、聯合等有結構的數據類型。1.結構定義語句結構是指一組相互關聯變量的組合,例如學生成績登記表中一個學生所登錄的各項:學號、姓名、性別、課程名稱、考試成績等。

結構類型變量可把類似上述一個學生的各項看成一個整體,定義、賦值、修改、引用都大為方便。

(1)結構類型的定義格式:<結構類型名>STRUC

…{數據定義偽指令序列} <結構類型名>ENDS 例:為學生考試成績登記表定義一個結構

STUDTABSTRUC NAME DB'WANGWEIHUA' ;姓名

SNO DD20020923H ;學號

SEX DB1 ;性別:0為女,1為男

COURSE DB'ASSEMBLER' ;課程名

SCORE DB90 ;成績

STUDTABENDS第33頁/共123頁(2)結構變量的說明

格式:[結構變量名]<結構類型名><<[字段初值表]>>其中結構變量名由用戶起,是可選項,沒有它匯編程序照樣分配空間。結構類型名是已定義的結構類型;<字段初值表>用來給結構變量的字段賦初值,它們的類型、順序必須與結構類型名定義的一致,各初值之間以逗號隔開。

若某字段的初值采用結構類型定義時的初值,可空缺不寫(但相應逗號不可省),若所有字段全部采用定義時的初值,可只寫一個尖括號<>;

尖括號<>在任何時候都不可省。 例:利用已定義的STUDTAB結構類型說明考試成績登記表中某學生的結構變量。

STUDENT1STUDTAB<>;各字段初值全部采用結構類型定義時的初值

STUDENT2STUDTAB<'ZHANGMING',20010907H,0,'PASCAL',85> ;各字段初值重新賦值

STUDENT3STUDTAB<'LIWEIDONG',20020918H,,'ENGLISH',> ;性別和成績字段采用結構定義時的初值;

;下面說明一個50個學生的結構數組,各字段初值采用結構類定義時的初值。

CLASS2STUDTAB50DUP(<>)第34頁/共123頁(3)結構變量字段值的修改

定義結構類型時可為各字段設置初值,說明結構變量時可對字段初值進行修改,使用結構變量時仍可對它們各個字段進行修改。只有用DB、DW或DD加以說明的單項字段才能被修改字段值,

而用重復運算符DUP說明的多重字段不能被修改。

對字符串類型的字段,修改后串的長度不能超過定義結構類型時的長度。(4)結構的使用結構類型定義在先,一般定義在程序的開始部分,也可定義在數據段中;結構變量說明在后,通常在數據段中加以說明;

最后在代碼段中對結構變量及其字段加以引用,包括對它們的值進行修改。對結構變量的引用,與引用其它變量一樣,可以通過名字對結構變量進行存取。要引用結構變量中的字段,可使用點運算符,形式為:結構變量名.結構字段名例:取出結構變量的字段MOVAL,STUDENT2.SCORE;取出學生結構變量STUDENT2的成績字段值送AL下面兩條指令完成的操作與上面一條指令相同:

MOVBX,OFFSETSTUDENT2 MOVAL,[BX].SCORE第35頁/共123頁2.記錄定義語句

記錄用于處理按二進制數位計算的數據信息。使用記錄,需要先定義記錄類型,再說明記錄變量,然后再使用記錄。(1)定義記錄類型格式:<記錄名>RECORD<字段名>:<寬度>[=表達式][,<字段名>:<寬度>…]

記錄名與字段名由用戶起,程序中記錄名不允許重名,同一記錄內字段名不允許重名。寬度必須是常數,表示該字段所占二進位的位數;表達式為可選項,表示該字段的初值,未選時初值為0。一個記錄中可有多個字段,它們之間用逗號隔開。16位微處理器方式,所有字段寬度之和不得超過16。寬度之和超過8時占用2個字節,匯編程序按字處理,否則按字節處理。若選用了386及以上方式,各字段寬度之和最多可達32;超過16位時,占用4個字節,按雙字存放和處理。例:定義一個表示學生情況的記錄,年齡占6位,性別占1位(0女,1男),健康狀況占一位(0健康,1不健康)

STATUSRECORDAGE:6=19,SEX:1,HEALTH:1 與結構一樣,記錄類型定義時不分配存儲空間。(2)記錄變量說明格式:[記錄變量名]<記錄名><<[字段初值表]>>

記錄變量名由用戶定義,可以省略(照樣分配內存),記錄名是已定義的記錄類型,字段初值表給各字段賦初值,各初值之間用逗號隔開,各項的順序應與記錄類型定義時的順序一致;若某字段值采用記錄類型定義時的初值,則可省略,僅寫逗號即可;若全部字段都采用定義時的初值,則僅寫尖括號。尖括號在任何時刻都不能省略。第36頁/共123頁2.記錄定義語句(續)例:用記錄類型STATUS定義記錄變量

ZHANG1STATUS<17,1,0> 被分配一個字節的記錄變量ZHANG1在內存中的分配形式為01011110,即該記錄變量的值為5EH。

WANG3STATUS<,0,0> WANG3記錄變量前6位為011001(記錄類型定義的初值),后兩位為00,該記錄值為64H。STUDEN1STATUS<> 記錄變量STUDENT1為一個字節,各字段值采用記錄類型定義時的初值,為67H。CLASS1STATUS50DUP(<18,1,0>) CLASS1是個記錄數組,共有50個元素,每個元素的三個字段初值分別為18、1、0,記錄值為62H。(3)記錄的使用可通過記錄變量名對記錄進行訪問,記錄變量名可以像其它變量名一樣使用。 例: MOVAL,ZHANG1 ;AL←5EH(ZHANG1記錄的值)記錄變量可作為操作數(立即數)使用。 例:MOVAH,STATUS<18,1,0> ;AH←62H記錄的字段名可在程序中直接使用,表示一個位移量,即該字段位移到記錄的最低位所需的移位次數。 例:MOVCL,SEX ;CL←1(SEX移到記錄最低位的次數)第37頁/共123頁2.記錄定義語句(續)給記錄變量(或記錄數組元素)的某字段賦值時不應破壞其余字段上的值,先用AND指令對該字段清0,再用OR指令將相應值設置在該字段上。對記錄數組元素的尋址與一般的字節、字或雙字的數組一樣,而對記錄數組元素的某一字段訪問與對記錄變量的字段訪問類似,只是將記錄變量名換為記錄數組元素的地址表達式。

例:把前面說明的記錄數組CLASS1的第三個元素的AGE字段設為18。可先取得第三個元素的起始地址,取出該元素字節值,將AGE字段清0,然后將字段值18送一個寄存器,并移位到高6位,再用OR指令置成相應值。指令序列如下:

MOVSI,OFFSETCLASS1 ;記錄數組的起始地址送SI ADDSI,2 ;生成第三個元素的起始地址

MOVAL,[SI] ;AL←第三個元素的字節值

ANDAL,03H ;將AGE字段清0

MOVAH,18 ;AH←18 MOVCL,AGE ;CL←移位次數2

SHLAH,CL ;AH左移2位,使18與AGE字段對齊

ORAL,AH ;將18置在AGE字段上

MOV[SI],AL ;將修改后的結果送回第三個單元

第38頁/共123頁3.聯合定義語句

聯合UNION也是一種結構性的數據類型,是MASM6.0新增的,實際上是對結構STRUC的一個補充。(1)聯合類型定義格式:<聯合名>UNION

┆{聯合體,由數據定義語句構成} <聯合名>ENDS

該語句定義了一個聯合類型,與STRUC類似,聯合體中的各字段由數據定義偽指令設置,但各字段的偏移地址與STRUC不一樣:STRUC中的字段在結構中順序分配,而UNION中的字段在聯合中從起始地址處重疊分配,所以聯合中各個字段的偏移地址均為0。因此定義聯合時字段不賦初值。定義UNIMING的聯合類型: UNIMING UNION XA DB? XB DB? XC DW? XD DD? UNIMING ENDS第39頁/共123頁(2)聯合變量說明

格式: <變量名><聯合名><<字段值表>> 字段值表須用尖括號<…>括起來,有關規定與結構變量相同。 定義一個聯合變量,分配存儲空間并給它的各個字段賦初值。 例:定義聯合變量

BIANLUNIMING<12345678H>后,

它的各個字段值如下:BIANL.XA=78HBIANL.XB=78H

BIANL.XC=5678HBIANL.CD=12345678H對聯合變量的字段訪問可用:聯合變量名.字段名。結構和聯合的定義可互相嵌套,這類定義適用于面向對象程序設計的結構和I/O端口的描述。

第40頁/共123頁5.2.4其它匯編技術

1.重復匯編重復匯編偽指令又稱重復塊偽指令,用來縮寫若干重復的語句,以便重復進行多次。重復塊可看著是宏展開的一種特殊形式,在匯編時展開。重復塊也可帶有形式參數,在匯編過程中被實際參數代替;但重復塊沒有名字,不能進行調用,只在原處重復若干次。重復塊偽指令共有三種:REPT、FOR(或IRP)和FORC(或IRPC),它們都用ENDM偽指令來結束,區別只是設置重復次數的方法不同;括弧中的偽指令名字是MASM5.X版本中使用的,在后續版本中仍可使用。(1)按參數值重復匯編 格式:

REPT<表達式>

…{重復的語句序列}

ENDM 其中表達式的值為REPT與ENDM之間的語句序列重復展開的次數。例:

TABLELABLEBYTE ;等價于

TABLELABLEBYTEX=0 ;DB1REPT5 ;DB2X=X+1 ;DB3DBX ;DB4ENDM ;DB5第41頁/共123頁1.重復匯編(續)(2)按參數個數重復匯編 格式:

FOR(或IRP)<形式參數>,<<實際參數表>>

…{重復的語句序列}

ENDM FOR(或IRP)與ENDM之間的語句對每個實際參數都執行一次,重復次數為實際參數的個數,實際參數必須用尖括弧括起來,在執行過程中用當前的實際參數去代替形式參數。 例

TABLELABELBYTE IRP X,<1,2,3,4,5>DB XENDM該段程序與上例是等價的。第42頁/共123頁1.重復匯編(續)(3)按參數字符個數重復匯編 格式:

FORC(或IRPC)<形式參數>,<字符串>或<<字符串>>

…{重復的語句序列}

ENDM 重復執行FORC(或IRPC)與ENDM之間的語句,每次都用當前字符中的字符去取代形式參數,重復的次數為字符串中字符的個數。如果字符串中包括空格、逗號或其它分隔符,則字符串必須用尖括號括起來。例:

TABLELABELBYTE IRPCX,12345 DBX ENDM該程序段與前2例是等價的。第43頁/共123頁2.條件匯編

條件匯編偽指令可根據條件對源程序塊有選擇地進行匯編,從而把某段指令序列包含在匯編語言源程序內,或者不對某段指令序列進行匯編。格式:

IF<條件> <語句序列1> [ELSE <語句序列2>]

ENDIF其中條件是偽指令助記符的一部分,

ELSE語句及其后的語句序列2是可選部分,

條件為真執行語句序列1,

為假執行語句序列2或者ENDIF之后的語句。

整個條件匯編以語句ENDIF結束。匯編條件有六組,見下表。

第44頁/共123頁第45頁/共123頁3.宏匯編

對程序中多次重復使用的指令序列,可給它取個名字,定義成一個宏,在源程序中書寫宏名就代表這個指令序列。匯編時把宏名展開成該指令序列,從而減少了程序的編寫量,使源程序更加簡練、清晰。(1)宏定義格式:<宏名>MACRO[形式參數表]

…{宏體}

ENDM宏名必須唯一,宏調用時用來代替所定義的宏體(具體內容),宏體由匯編語言所允許的任何語句(指令或偽指令)組成,它決定了宏的功能。

形式參數根據宏體需要可以沒有,或者有一個或多個;有多個形式參數時相互之間要用逗號或空格或制表符分隔開。

調用宏時要依次用對應的實參去取代。宏體中可以定義或調用另一個宏。定義一個宏,相當于增加了一條偽指令,匯編時告訴匯編程序用宏體來代替該名字。宏要先定義,后調用。宏定義一般放在源程序文本的開始處,而不放在某一個段內。第46頁/共123頁3.宏匯編(續)例:定義一個宏,參數為0時執行輸入的DOS功能調用,否則執行輸出的DOS功能調用。

INOUTMACROP IFP MOVAH,2 INT21H;輸出DL中的字符

ELSE MOVAH,1INT21H;輸入的字符送ALENDIF ENDM第47頁/共123頁3.宏匯編(續)(2)宏的調用與展開格式:<宏名>[實際參數表] 宏名必須是已定義的,實際參數表中參數的類型和順序應與宏定義時的形式參數一一對應;實參個數多于形參時,多余的實參被忽略;實參個數少于形參的,多余的形參用空串取代。匯編源程序時,匯編程序要對源程序中所有的宏調用進行展開,即將宏名所定義的指令序列插入到宏調用處。宏與子程序(即過程)有所不同。宏調用是把宏體展開,程序中有幾處宏調用就展開幾次,源程序代碼長,不節省存儲空間,但展開后執行速度快,節省運行時間;子程序調用不展開子程序代碼(子程序仍存儲在原處),但改變程序流程,由主程序調用處轉入子程序去執行,執行完畢再返回主程序調用處繼續執行,子程序調用前后要保護和恢復現場,因此執行時間長,但節省存儲空間。第48頁/共123頁3.宏匯編(續)(3)宏操作符

宏匯編程序MASM提供了相應的宏操作符,用于宏參數的傳遞連接,如下表所示。(4)宏的刪除PURGE當宏在程序中調用完之后而再也用不到時,可用PURGE偽指令刪除之,以釋放它所占用的存儲空間。格式:PURGE<宏名>[,宏名…]第49頁/共123頁3.宏匯編(續)(5)宏庫為避免重復定義的麻煩,可將通用的宏定義集中放在一個單獨的文件中,即放在后綴為.MAC的宏庫文件中,宏庫中可以有多個宏定義。可用任一個編輯程序像建立源程序那樣來建立宏庫。宏庫中的宏必須是通用的例行程序或程序段,對宏中使用的寄存器及狀態標志要入棧保存,宏定義中的標號要先用Local偽指令定義(限定只在宏內使用)。在程序中可用INCLUDE偽指令將宏庫中的宏定義復制到該指令所在的位置:

INCLUDE[盤符:\路徑\]<文件名>[.擴展名]

INCLUDE功能是通知匯編程序把指定的文件拷貝一份,插入到該語句下方,供匯編使用。如INCLUDEMLIB.MAC語句將宏庫中MLIB.MAC的全部宏定義復制出來。

一般INCLUDE偽指令也放在源程序的開始部分。為避免匯編程序兩次掃描都去重復讀宏庫文件,可用條件匯編IF1使宏庫文件只在第一遍掃描時讀入:

IF1 INCLUDEMLIB.MAC ENDIF

…第50頁/共123頁5.3匯編語言程序上機過程

匯編語言程序上機運行的過程有以下幾個步驟:(1)

用編輯程序建立.ASM源文件;(2)

用宏匯編程序MASM等匯編源文件,生成.OBJ目標碼文件;(3)

用連接程序LINK對目標碼文件等模塊進行連接,生成.EXE可執行文件;(4)

鍵入可執行文件名執行該文件,分析執行結果;(5)用DEBUG等工具調試.ASM源程序,再匯編、連接、運行,直到得出正確結果。 為此,除了DOS系統軟件和編輯程序外,還需要備置如下程序:匯編程序

masm.exe或asm.exe或tasm.exe等連接程序

link.exe或tlink.exe等匯編調試程序

等交叉引用程序

cref.exe等

第51頁/共123頁5.3.1編輯源程序

可使用任何一種能建立ASCII文本文件的編輯程序來建立匯編源程序文件,擴展名為.ASM。在使用各種文字編輯程序時,被編輯的源文件(.ASM)中不應有排版格式控制符。5.3.2匯編源程序編輯生成的.ASM源程序文件,須經匯編程序進行匯編,生成二進制代碼的目標文件。常見的匯編程序有行匯編和宏匯編兩種類型。

◆行匯編——常用DEBUG.EXE的A命令,生成的目標代碼可作為.COM

文件存盤,也可在DEBUG環境下直接運行。

行匯編簡單直觀,生成的目標程序所占用的內存空間最小;但匯編按

絕對地址進行,長度限制在64KB范圍內,目標程序沒有與其它程序模

塊連接的信息,要由用戶或安裝程序實現各個目標程序在內存中的地

址分配,這樣既可能使各程序之間產生太大的空隙(造成浪費)、也

可能造成各程序的內存存儲沖突。

◆宏匯編MASM——對匯編語言源程序*.ASM進行匯編常用方法。第52頁/共123頁5.3.2匯編源程序(續)對早期版本的宏匯編程序,在DOS操作系統提示符下鍵入MASM后,MASM宏匯編程序被調入運行。屏幕上顯示版本信息之后,對需要輸入輸出的4個文件提問如下:

sourcefilename[.ASM]:EXAMobjectfilename[EXAM.OBJ]:Sourcelisting[NUL.LST]:EXAMCross-reference[NUL.CRF]:EXAM第一個詢問的是被匯編的源程序文件名,鍵入文件名(這里為EXAM,不必鍵入后綴),MASM即對其進行匯編。匯編過程會產生三個文件,第一個是擴展名為.OBJ的目標文件,這是匯編的主要目的,在提示詢問后面直接按回車表示同意采用方括號內的缺省文件名,否則鍵入目標文件的新名字后再按回車。產生的第二個文件是擴展名為.LST的列表文件。列表文件可不要,若不要則在提示詢問后面直接按回車鍵,否則鍵入列表文件名(后綴不必鍵入)后再按回車。

.LIST列表文件是個文本文件,有兩部分:源程序列表和符號名表。

第一部分對源程序中的每條語句從左到右依次列出:段內偏移地址、機器代碼、指令助記符;程序中若有語法錯誤,則列出錯誤信息。

第二部分列出程序中所定義的全部標識符信息,如段的名稱、長度,變量和標號的名稱、類型、偏移地址等。這一文件可打印出來供檢查用。第53頁/共123頁5.3.2匯編源程序(續)匯編產生的第三個文件是擴展名為.CRF的交叉引用文件,也是可要可不要,回答的辦法同第二個列表文件。交叉引用文件是個二進制文件,須經交叉引用程序CREF將其轉換成交叉引用列表文件(后綴為.REF的ASCII文本文件)后方可顯示輸出,轉換方法為:

C:>CREF<文件名> 轉換后的交叉引用列表文件按字母順序列出了源程序中使用的所有符號的列表。4個問題回答完畢,MASM就對源程序進行匯編。匯編中若發現源程序有語法錯誤則列出錯誤的語句和錯誤的代碼,指出是什么性質的錯誤。最后列出警告錯誤(WarningErrors)和嚴重錯誤(SevereErrors)的總數。MASM軟件有許多版本,現在常用的MASM6.X功能很強,包含有許多文件,最常用的是:匯編器ML.EXE、連接器

LINK.EXE、調試器CV.EXE等。匯編器ML.EXE(MasmandLink)能自動調用LINK,實現對源程序的匯編和連接。使用ML命令進行匯編連接的格式如下:ML[/<選項>…]<源文件列表>[/<連接選項>…]第54頁/共123頁5.3.2匯編源程序(續)<源文件列表>中的多個文件以空格分隔,文件名必須完整,擴展名.ASM不能省略;ML后的參數對大小寫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論