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

下載本文檔

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

文檔簡介

第5章匯編語言程序設計

■內容提要

■本章描述了匯編語言源程序結構、匯編語言語句及其格式,

講解了常用偽指令語句、語句中操作數項表達式及常用操作符,

介紹了常用匯編技術、匯編語言上機過程、DOS功能調用及BIOS

中斷調用、DEBUG調試程序,

敘述了常用程序設計方法和保護方式下的編程、模塊化程序設計以

及匯編語言和C語言的混合編程。

■5.1匯編語言程序結構

■5.2匯編語言語句

■5.3匯編語言程序上機過程

■5.4匯編語言程序設計

■5.5模塊化程序設計

5.1匯編語言程序結構

■1.方式選擇偽指令

■Intel系列微處理器不斷發展換代并保持向上兼容,不同版本的MSAM

對應不同代的微處理器的指令集和匯編偽指令。因此方式選擇偽指令既

是選擇微處理機,實質上也是選擇相應的指令集。

■MASM宏匯編程序提供的方式選擇偽指令如下:

■.8086——只匯編8086/8088的指令,此為默認方式

■.286或286c——同.8086并只匯編80286非特權(實模式)指令

■.286P——同.8086并匯編80286全部指令(包括保護方式)

■.287——用于匯編80287協處理器指令

■.386或.386C——同.286并匯編80386非特權(實模式)指令

■.386P——同.286P并匯編80386全部指令(包括保護方式)

■.387——用于匯編80387協處理器指令

■.486或486c——同.386并匯編80486非特權(實模式)指令

■.486P——同.386P并匯編80486全部指令(包括保護方式)

■.586或586c——用于匯編Pentium微處理器非特權(實模式)指令

■.586P——用于匯編Pentium微處理器保護方式在內的所有指令

1.方式選擇偽指令(續)

■以下三條偽指令是MASM6.12引入的:

■.686——用于匯編PentiumPro到Pentium4微處理器非特權(實模式)指令

■.686P——用于匯編PentiumPro到Pentium4微處理器保護方式在內的所有指令

■.MMX——用于匯編MMX指令

■.K3D——用于匯編AMD微處理器3DNOW!指令。是MASM6.13引入的

■.XMM——用于匯編SSE和SSE2指令。是MASM6.15引入的

■2.完整的段定義

■使用完整的段定義偽指令來定義一個段,可具體控制匯編程序MASKED

連接程序LINK在內存中組織代碼和數據的方式。

整個邏輯段必須用段定義語句括起來。

■(1)SEGMENT——ENDS偽指令

■v段名,SEGMENT[定位類型]〔組合方式]〔段長度]〔分類名]

■:{段體}

■v段名,ENDS

■每個邏輯段都以SEGMENT語句開頭,以ENDS語句結束;

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

儲器中的位置。

(1)SEGMENT——ENDS偽指令(續)

■段開始和結束語句之間部分是段的內容一

對數據段、堆棧段和附加段而言,一般由存儲單元定義、分配等偽指令所組成,

對代碼段,則主要是由可執行指令以及某些偽指令組成。

■方括號中是定位類型、組合方式、分類名和段長度等的說明,視情況可以省略。

若對本邏輯段在內存中的定位加以限定、或需與其它段相連接,則須按規定選擇

這些項。

■定位類型(Align-type)規定該段的起始位置。有以下幾種選擇:

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

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

■DWORD:段的起始地址是4的整數倍,適合雙字類型的數據段定位;

■PARA:段的起始位置是16的整數倍,即從節(24=16為一節)的邊界開始;

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

■INPAGE:該段長度不超過256個字節(一頁之內),不允許跨頁存放。

■定位類型缺省時為PARA方式。

(1)SEGMENT——ENDS偽指令(續)

■組合方式(Combinetype)又稱連接方式,規定連接程序LINK處理本段與其它邏輯

段時如何進行相互連接。可以有以下幾種:

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

PRIVATEo

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預置

數據將失敗。

(1)SEGMENT——ENDS偽指令(續)

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

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

對32位CPU,有兩種方式(默認選項是USE32):

-USE16:表示邏輯段最大長度為64K,訪問該邏輯段采用16位尋址方式。

-USE32:表示邏輯段最大長度為4G,訪問該邏輯段采用32位尋址方式。

■分類名用單引號括起來的長度不超過40個字符的字符串。

-連接程序把不同模塊中分類名相同的段組織成一類,存放在連續的存儲區域。

習慣上數據段/代碼段/堆棧段的分類名分別用'DATA/CODE/STACK,表示。

(2)段分配語句ASSUME

■段分配偽指令ASSUME用來通知匯編程序:CS、DS、SS、ES將被設置

成那些段的段基址寄存器,這樣在匯編時就能知道語句中引用的變量和

標號是通過那些寄存器進行訪問的。

■ASSUME〈段寄存器名>:〈邏輯段名,:〈邏輯段名>...1卜段寄存器名>:〈邏輯段名〉

邏輯段名>..上…:V段寄存器名>:NOTHING1]

■偽指令語句ASUMENOTHING將刪除所有已設置的段寄存器與段名之間的關聯。

■ASUME偽指令只是建立段名和段寄存器之間的關聯,并未把各個段的段

基址裝入相應的段寄存器中。段基址的裝入通常采用程序方法。

■①DS和ES裝入:在程序中用指令經通用寄存器間接裝入段基址。

■②SS裝入:有兩種方法——

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

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

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

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

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

■③CS和IP裝入:對CS和IP,通常是按照結束偽指令END卜起始地址刁

指定的地址來自動完成段基址和偏移地址裝入的。

(3)2且定義偽指令GROUP

■當用段定義語句SEGMENT—ENDS定義了若干個邏輯段而總容量不超

過64K時,就可把這些段用GROUP語句定義為一個“組”,格式如下:

■v組名,GROUPv段名1>1;段名2,]

■GROUP把程序模塊中若干個不同名字的段組合成一個組,并賦予一個

組名,組內各段都裝在一個物理段中,使組內各段間的跳轉都視作段內

跳轉。

■語句中的段名可以是表達式SEGv變量名標號>,表達式的值

是定義該變量或標號的段號。

語句中的段名可以是表達式SEGv變量名>或5£6<標號,,表達式的值

是定義該變量或標號的段號。

■組名是標識組的起始地址的標號,表示該組的段基址。組中各個段內的

偏移地址都以這個基址為起點,而不以本段原來的段基址為起點。組名

的使用方法與段名相同。

3.定位語句

■(1)ORG語句

■匯編源程序時,匯編程序將段名填入段表,并為該段配置一個位置計數

器(初值為0),該計數器依次累計段內語句被匯編后所生成的目標代碼

的字節數,跟蹤匯編過程。

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

■格式:ORGv數值表達式,

■數值表達式中可用“$”表示位置計數器的當前值,表達式的值為正整數;

ORG語句把表達式的值賦給位置計數器。

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

在數據段,ORG后的數據定義偽指令就從指定位置分配所定義的數據。

■(2)EVEN語句

■格式:EVEN

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

遇到EVEN語句時,若地址計數器值$為奇數,在代碼段匯編程序自動插

入一條單字節空操作指令NOP,使$變為偶數;在數據段自動將$值加1,

使下面定義的數據從偶地址單元開始存放。

4.模塊開始與結束語句

■(1)模塊開始語句

■模塊開始語句Name表示源程序的開始并為模塊取名字,格式如下:

NAMEv模塊名,

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

也可使用title語句,格式:TITLEv標題,

■title偽指令指定了在每一頁上打印的標題,最多為60個字符。如果程序中

沒有使用NAME偽指令,則匯編程序MASM將用title語句中標題的前6個

字符作為模塊名。如果程序中既無NAME語句,又無TITLE語句,則將用

源文件名作為模塊名。

■(2)模塊結束語句END

■END表示源程序到此結束,并可指出程序的啟動地址。格式如下:

■END[標號/過程名]

■該語句一般放在源程序最后一行,程序中有且只能有一個END語句。其

中標號或過程名給出了程序開始執行的啟動單元地址,只有主模塊才可

有此選項。

?當連接的多個模塊中都沒有給出啟動地址,將從代碼段的第一個字節

處開始執行,

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

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

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

5.返回操作系統方式

■(1)使用功能號為4cH的DOS功能調用

■調用方式:MOVAH.4CH;功能號4cH送AH寄存器

■INT21H;DOS系統功能調用

■這是最有效且兼容性最好的返回DOS方式。

■(2)將主程序定義為遠過程

■在代碼段中,將主程序定義為遠過程,由RET語句返回。

■〈主過程名〉PROCFAR

■:...;{主程序}

■RET

■〈主過程名〉ENDP

■(3)利用20H號BIOS中斷調用

■這種方式只能用于擴展名為COM的可執行文件。

■調用方式為:INT20H

■(4)利用。號DOS系統功能調用

■該方式與INT20H一樣,只有在.COM類型的文件中才可使用。調用格式如下:

■MOVAH.0;功能號送AH

■INT21H;DOS系統功能調用

5.1.2段定義的簡化

■在MASM5.0及以上版本中,段的定義可以非常簡單,方便了程序設計。使用簡

化段定義偽指令前,必須先說明用戶程序使用的內存模式。

■1.內存模式定義偽指令MODEL

內存模式指用戶程序的代碼和數據的存放格式,及他們占用內存的大小。

.MODEL〈存儲模式語言類型]『,操作系統類型1堆棧類型]

■①存儲模式:共有七種——

■TINY——微型模式。

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

6.0才引入的。

■SMALL——小型模式。

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

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

來實現。

■MEDIUM——中型模式。

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

因此代碼訪問是遠程(FAR)的,數據訪問是近程的。

■COMPACT——壓縮模式。

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

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

是遠程的。

L內存模式定義偽指令(續)

■LARGE——大型模式。

程序中的代碼和數據都超過64KB,但靜態(常數)數據限制在64KB之內;對代

碼和數據的訪問默認都是遠程的。

■HUGE——巨型模式。

程序中的代碼和數據均大于64KB,靜態數據也可以超過64KB。對代碼、數據和

數組的訪問都是遠程的。

■FLAT——平展模式。

DOS下不能使用此模式。該模式用于創建32位的Windows程序,只能運行在32位

的80x86微處理器上。

■②語言類型

子程序語言類型用來告訴匯編程序使用什么樣的標識符命名風格、子程序調用和

返回約定等。語言類型說明可使匯編程序和其他語言程序共享。有效的語言類型

為C、SYSCALL(系統調用)、STDCALL(標準調用)、BASIC>FORTRAN、

PASCAL等o

■③操作系統類型

■OS_DOS是當前唯一支持的選項也是該選項的缺省值。

■④建棧類型

堆棧類型有如下兩個選項,不同選值主要影響偽指令.STARTUP所生成的指令序

列。

■NEARSTACK一堆棧段和數據段是同一個段。這也是該選項的缺省值。

FARSTACK——堆棧段和數據段是不同的段,且堆棧段不在段組DGROUP中。

2.簡化的段定義

■(1)簡化段定義偽指令

■簡化段定義偽指令在.MODELv存儲模式,語句之后,如下所列。

每個簡化段偽指令都可用來表示一個段的開始,同時也說明前一個段結

束。

■.STACK[長度];定義堆棧段,長度缺省值為1KB

■CODE[名字];定義代碼段

■.DATA;定義數據段

■.DATA?;定義數據段,初值不確定

■.FARDATA[名字];定義遠調用數據段

■.FARDATA?[名字];定義遠調用數據段,初值不確定

■.CONST;定義只讀常數數據段

■.STARTUP;程序起始點,并初始化DS、SS

■.EXIT0;程序結束點,返回操作系統

■上述簡化段定義偽指令中帶方括號的項可省略。

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

(2)缺省段名

使用簡化的段定義偽指令,每個段都有一個缺省的段名,如下表所示。

不同內存模式下的缺省段名及其屬性

內存模式段定義偽指令段名定位組合類另1]組名

.CODE_TEXT\WRDPUBLIC?CODEDGROUP

BATA_DATAWORDPUBLIC,DATADGROUP

TINY

.CONSTCONSTWORDPUBLIC,CONSTDGROUP

BATA^孚SSWORDPUBLICaBSS-:DGROUP

.CODEnameJEXT*XWRDPUBLIC4C0DE'

DATA_DATAWDRDPUBLICfcDATA'DGROUP

SMALL

CONSTCONSTAWRDPUBLIC?CONST,DGROUP

'IEDIU7

DATA"_BSSWORDPUBLIC-BSS;:DGROUP

.STACKSTACKP.ARASTACKcSTACK'DGROUP

,CODEnameJTEXT**W3RDPUBLIC'CODE'

JARDATAFARJJATAPARAPRIVATET.ARJDATA,

T.ARDATAnF.AR_BSSPARAPRIVATE?F.AR^SS'

COMPACT

DATA_DATAAXDRDPUBLICaDATADGROUP

LARGEHUGE

CONSTCONSTWORDPUBLIC"CONST,DGROUP

DAT.V_BSSWORDPUBLICsBSS,sDGROUP

.STACKSTACKPARASTACK;STACK,DGROUP

,CODE_TEXTDWORDPUBLIC,CODE-

TARDATADATADWORDPUBLIC'DATA-

.FARDATAn_BSSDWORDPUBLICESS,

FLATJDATA_DATADWORDPUBLICkDATA

.CONSTCONSTDWORDPUBLIC£CONST,

DAT.9^BSSDWORDPUBLIC?BSS?

.STACKSTACKDWORDPUBLICSTACK'

*:S'iALL模式的代碼段段名沒有可變部分name**:CO'IPAC二模式的代碼段段名沒有可變音階name

2.簡化的段定義(續)

■(3)等價段名

■MASM5.0宏匯編語言中規定了幾個代替真實段名的等價段名,

代替簡化段定義偽指令前的小數點。如@00口£代衣CODE定義的段名,

@DATA代表.DATA、.DATA?、.CONST和.STACK共享的組名,

@FARDATA代表.FARDATA定義的段名,等等。

■(4)定義段序偽指令

■MASM可以對匯編結果的目標文件中各段的位置進行排序。

定義段序的偽指令有三種。

■.SEG——按照段在程序中出現的順序對之排序。

這是完整段定義格式中的默認順序。

■.ALPHA——按照字母順序對段排序。

■.DOSSEG——按照DOS定義的標準段序。

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

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

3.源程序編程格式

■(1).EXE文件編程格式

■該格式下源程序允許使用多個邏輯段,適合編寫大型程序,匯編-連接后生成擴展

名為.EX日的可執行文件。

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

代碼段的開始用一條ASUME語句設置段約定。

■在實模式下,每個邏輯段的目標模塊最大64KB;

在保護模式下,80286不超過16MB,32位的80x86不超過4GB。

■.ASM源程序匯編、連接后生成可執行文件EXE,.EXE文件有重定位信息。

DOS裝入.EXE文件,再根據重定位信息完成對目標模塊的重定位,然后在目標程

序的上方(低地址處)自動生成256個字節的程序段前綴PSP(ProgramSegment

Prefix),DOS通過PSP管理用戶程序(如程序結束時返回DOS的途徑等)。

■DOS自動使DS=ES=PSP的段基址,FS=GS=0,CS:IP指向用戶程序的啟動地址,

SS:SP指向用戶堆棧的棧頂。

然后DOS把控制權交給用戶程序。由于DOS給DS、ES、FS、GS所賦的初值不

等于用戶程序數據段、附加段的段基址,因此用戶程序開始處必須對所用的段寄

存器DS(及ES、FS、GS)等進行初始賦值。

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文件:

■EXE2BINv文件名[.EXE1>〈文件名COM>

前一個文件名后綴.EXE可省略,但后一個文件名的后綴COM必須寫上,否則將生

成.BIN文件(它不能裝入執行)。

用高版本匯編TASM.EXE匯編.ASM文件后,只需在連接(TLINK.EXE)時使用小

寫的“t”做連接參數就可直接生產.COM文件。

5.2匯編語言語句

■5.2.1匯編語言

■匯編語言是面向機器的程序設計語言,是為特定的計算機系列設計的,

使用英文宿寫的指令助記符、符號地址及標號等編寫程序語句。

■與其它程序類似,匯編語言源程序由語句行構成。

■1.匯編程序

■匯編程序的種類很多,主要功能基本相同:把匯編語言源程序翻譯成二

進制代碼,但匯編的處理器指令集和偽指令語句集有所不同。

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

功能越全;

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

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

作符。

2.語句分類

■構成匯編源程序的語句可分為兩大類:指令性語句和指示性語句。

■指令性語句就是指令語句,是CPU要執行的語句部分。

指令語句由匯編程序匯編、翻譯成目標代碼,一條指令語句對應一條機

器語言指令代碼,規定機器的一種操作。

■指示性語句不是計算機系統指令集提供的,因此又稱為偽指令。

每種匯編程序都有自己的偽指令集,偽指令主要作用是為匯編程序服務,

告訴匯編程序如何翻譯指令語句、以及如何分配內存、定義數據、進行

各種有關的處理(替換、條件匯編、連接、列清單等等)。

偽指令匯編時由匯編程序執行,不產生機器代碼。

3.語句結構

■指令性語句:曲號:]V助記符,[操作數]〔:注釋]

■指示性語句:[名字]〈定義符,[操作數][;注釋]

■<……>尖括號內的為必選項,[……]方括號內的為可選項。

■(1)標號和名字

■指令性語句中的標號后一定要跟冒號,而指示性語句中的名字后不能有

冒號,這是兩種語句在格式上的主要區別之一。

■標號在代碼段中設置,表示本語句的符號地址,可作為轉移指令或Call

指令的目標地址,因而標號只出現在作為目標而被訪問的語句中。

■名字可以是變量名、段名、過程名、符號名等,語句中是否出現名字及

出現什么名字取決于定義符的要求。

■標號或名字可由下列字符組成:

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

除數字外的字符都可以作為第一個字符出現,若使用符號則必須出

現在開頭位置。

組成標號或名字的字符可以有多個,但只有前31個被匯編程序識別和承

認。

(2)助記符和定義符

■指令語句中的助記符表示該指令的操作碼類型,規定了語句的操作功能,

如ADD、LOOP等。

偽指令中的定義符規定了該語句的偽操作功能,由匯編程序進行處理。

■除了注釋語句外,助記符或定義符是匯編語句中必不可少的項目。

■(3)操作數

■操作數項可以是常數、寄存器、標號、變量或者表達式。

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

分并。

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

對偽指令語句,該項則給出所需的參數,可以有多個。

■(4)注釋

■注釋以分號開始,用來對一段程序或某些指令在程序中的作用加以說明,

增加程序的可讀性。注釋不被匯編程序匯編,也不被執行。

■一條語句一般只占一行,超過一行要用續行符指明。兩條語句不能

寫在同一行上。

■匯編源程序語句最多由四個部分組成;書寫時各部分之間要留有一定數

量的空格,以使各語句的相應部分全部左對齊,使整個程序規范整齊,

清晰明了。

5.2.2數據定義語句

■1.變量定義語句

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

變量名是存放數據的存儲單元符號地址,變量值是對應存儲單元的內容。

■(1)語句格式

■格式一:[變量名]V定義符〉V數據項表》〔;注釋〕

■格式二:[變量名]V定義符>v常數表達式,DUP(V數據項表,)[:注釋]

■變量名是可選項,表示符號地址,標記該語句數據項表中第一個數據的

偏移地址,變量的值就是該偏移地址單元的存儲內容。

■定義符是必選項,用來定義數據項的類型屬性,常用的有以下幾種:

■DB——定義字節,項表的每個數據項為字節,類型屬性為1;

■DW——定義字,項表的每個數據項為字(2個字節長),類型屬性為2;

■DD——定義雙字,項表的每個數據項為雙字,類型屬性為4;

■DF——定義長字,項表的每個數據項為三字(48位二進位),類型屬性為

6,僅用于386CPU上的指針變量;

■DQ——定義四字,項表的每個數據項為四字,類型屬性為8;

DT——定義十個字節,項表的每個數據項為十字節,類型屬性為10。

(2)變量定義語句例舉

DBYTEDB10,-10,10H

DWORDDW100,-100,100H

DDWDD4*20,0FFFDH;變量匯編存儲結果見下圖左

MESSAGEDDB'HELLO'

MESSAGE1DB'AB'

MESSAGE2DW'AB4;變量匯編存儲結果見下圖中

BUF1DBJ???o;“?”操作數可預留空間,不存入數據

BUF2DW?,36,?;變量匯編存儲結果見下圖右

Memory

定義變量匯編結果

DBYTEMemory

5memoryBF

DWORD000(字節)

HAs碼

MESSAGO,XX

100Ascl碼1保留3字節空間

,XX作原存幡值不變)

-1010EAsCI碼

,XX

LAsCI用000(字節)

,BF

LAs5C碼)保留1字空間

MESSAGE1AXX

'As碼貝原存儲值不變)

DDWCIXX

4*2As碼DMB

MESSAGE2B'CI24}36(字)

BA',ASCI碼00

CIXX\保留1字空間

卜FFFDHXXJ(原存儲值不變)

用地址表達式定義變量

地址表達式的運算結果是一個地址(無符號數),指向某個存儲單元;

該存儲單元若用來存放數據,則為變量,若存放指令代碼,則為標號。

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

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

DD用來將已知變量或標號的偏移地址和段基址分別置入新變量的低位字和高位字中。

設程序中已定義了變量VI和V2,代碼段中已定義了標號FIRS和LLT,則可用它們來定義

新變量如下:

NV1DWFIRS;把標號FIRS的偏移地址賦給字變量NV1

NV2DDLLT;把標號LLT的偏移地址和段基址賦給雙字變量NV2

NV3DWVI;把變量VI的偏移地址賦給字變量NV3

NV4DDV2;把變量V2的偏移地址和段基址賦給雙字變量NV4

格式二用復制操作符DUP(Duplicationoperator)來復制或重復定義變量;

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

ARRAY1DB2DUP(0,10,10H,?);等價于ARRAY1DB0,10,1OH,?,0,10,1OH,?

ARRAY2DW100DUP(?)

DUP操作可以嵌套:TABIDB2DUP(1,2,3DUP(10))

TAB2DW10DUP(5DUP(2DUP(1100H,2200H)))

上面第一條語句定義了TABI開始的10個字節單元,其內容為1,2,10,10,10,1,2,10,10,10;

第二條語句定義了TAB2開始的200個(10X5X2X2)字單元,其內容為1100H,2200H重復2

次(4個字單元)、再重復5次(5X4=20個字單元)、再重復10次(20X10=200字單元),TAB2救

組有200個字單元,占400個字節存儲空間。

(3)變量類型屬性

變量被定義后具有相應的值,還具有類型屬性,變量表達式的類型屬性和變量相同。

匯編程序用類型屬性來表明指令操作數的字節長度。指令在執行運算時,操作數作為參加

運算的對象,其類型屬性必須相同,否則出錯。

2.標號

■標號表示指令性語句的符號地址,作為轉移類指令的目標操作數,一目

了然地確定程序轉移的目標地址。

■(1)標號屬性

■段屬性(SEG)表示標號所在段的段基址。

■偏移屬性(OFFSET)表示標號在段內的偏移地址(從段基址到標號位

置之間的字節數),是16位或32位無符號數。

■距離屬性(TYPE)也叫類型屬性,指出標號被訪問的段別:

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

指令性語句標號之后必須有一個冒號,這個標號的默認屬性為NEAR。

遠程FAR——允許其它段跨段訪問的標號。

■標號也可以作為過程定義語句的過程名,用作調用指令的目標地址。

■(2)更改屬性的偽指令

■標號和變量,其屬性可用PTR偽指令臨時指定,用THIS和TABLE偽指令

另行指定。

2.標號(續)

■PTR屬性操作符

■格式:<類型>PTR〈變量或標號「土常數表達式常

其中變量類型可以是BYTE、WORD、DWORD等,標號類型可以是NEAR或FAR。

PTR臨時指定某個變量、標號或地址表達式所指存儲單元的類型或距離屬性,使

其具有語句左邊的〈類型〉屬性(與原定義的不同)。

例:BUF3DB1,2

BUF4DW3456H,7890H

MOVAX,BUF3+1;出錯,操作數類型不匹配

MOVBL,BUF4;出錯,操作數類型不匹配

匯編程序在匯編這段程序時,發現兩條MOV指令的類型屬性不同:第一條MOV指令

AX為字類型而BUF3+1為字節類型,第二條MOV指令BL為字節類型而BUF4為字

類型,因而出錯并提示:(這兩條指令)操作數類型不匹配。用PTR運算符改變它

們的屬性,改正如下:

BUF3DB1,2

BUF4DW3456H,7890H

MOVAX,WORDPTRBUF3+1;5602H送AX

MOVBL,BYTEPTRBUF4;56H送BL

2.標號(續)

■THIS屬性運算符

■格式:THIS〈類型〉

■THIS運算符常與偽指令EQU、二連用,為當前存儲單元定義一個指定類型的變量

或標號。THIS不分配新的存儲單元。

例:BUFEQUTHISWORD

POTEQUTHISFAR

第一(或第二)條語句表示從本語句開始,變量BUF(或標號POT)的類型屬性就定

義為字(或FAR),而不管BUF(或POT)原來的類型是什么,直到遇到新的類

型定義語句為止。

■LABLE偽指令

LABEL語句用來給變量或標號取一個別名,并可重新定義它的類型屬性。這使得同

一個變量或標號以不同的名字引用時具有不同類型的屬性。

■格式:v名字,LABEL〈類型>

被LABEL定義的名生,其位置與緊跟在該語句下面的指令(變量定義偽指令或帶標號

的指令)具有相同的段基址和偏移地址。

■例:BARRAYLABELBYTE

■DARRAYDW100DUP(?)

■MOVBRRAY+2,0

■MOVDARRAY+2,0

BARRAY和它下面的DARRAY的地址是相同的,它們指向同一數組。BARRAY被

定義成字節型,第一條MOV指令把該數組的第3個字節置0;DARRAY被定義成字

類型,第二條MOV指令把該數組的第3個字(即第4和第5個字節)置0。

3.符號定義語句

為方便程序設計,對程序中多次出現的同一個常量、字符串或表達式,

可以用符號定義偽指令賦予一個符號名;也可給某些符號取新的名字并

賦予新的類型屬性。

■符號定義語句不占用內存。

■(1)等值語句EQU

■格式:v符號名>EQUv表達式,

■表達式可以是數值、地址、新類型屬性或其它符號名,EQU將左邊的符

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

達式。

■例:P0RT1EQU20H

P0RT2EQUPR0T1+1

BUF_SIZEEQUPORT2*2

COUNTEQUCX;COUNT代表CX寄存器

B8EQU[BP+8];B8代表地址引用[BP+8]

CHAREQUC

CBDEQUDAA;CBD代表指令助記符DAA

DECCOUNTY等CX寄存器內容減1

3.符號定義語句(續)

■(2)等號語句=

■等號語句功能與EQU語句相同,但是等號語句定義的符號名在程序中可

重新定義,并且表達式只能是數值表達式。

■例:DAT=100;DAT定義為100

COUNT=DAT+10;COUNT定義為110

LLP=3

I

I

I

COUNT=COUNT-20;重新定義COUNT為90

DAT=200;重新定義DAT為200

■LABLE可定義新的符號并賦予不同的屬性;THIS、PTR可和EQU、二等

偽指令連用,賦給新定義的符號以不同的屬性。

4.常量

■常量又叫常數,在匯編時有確定的值,一般在程序執行過程中不再改變。

常量主要用于偽指令語句中給變量賦值,也用做指令中的立即數或存儲

器操作數的組成部分。

常量可用數值形式直接寫在指令語句中,也可預先為它定義一個名字保存

在存儲單兀內。

■數值常量——常用作語句操作數項中的常數,可以是二、八、十六或十

進制數,分別在數值末尾加“B”、“Q”(或“O")、“H”和"D”標記。

數尾不加標記的,匯編程序默認作十進制數。

偽指令RADEX可以把默認的基數改變為2?16范圍內的任何基數:

■.RADIXv基數表達式〉

其中基數表達式的結果為2?16之間的十進制整數,用來表示基數值。下面

兩組指令是等價的:

MOVBX,OFFH.RADIX16

■MOVCX,178MOVBX,OFF

■MOVCX,178D

4.常量(續)

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

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

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

■浮點常數用十進制數科學計數法表示,如SINEDD0.538E-1o

■十六進制實常數與十六進制常數相似,但第一個字符必須是數字(0

9),數尾緊跟字母R,而且其位數必須是8、16或20。

如HRNUMBDD0BAEF1234R

■5.表達式和運算符

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

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

為指令的操作數,執行指令所規定的操作。

表達式的計算在匯編時完成,指令的運算在程序執行過程中完成。

■表達式的結果是一個數值則稱為數值表達式,結果是一個存儲單元的地

址時則稱為地址表達式。

■地址單元中存放的是數據則稱為變量,地址單元中存放的是指令則稱為

標號。

MASM宏匯編程序中的表達式由操作符和操作對象組成,允許使用的操作符有六種類型,

■可進行邕術運算、邏輯運算、關系運算、回送運算、修改類型屬性運算與專用運算等。如

下表所小。_______MASZ表達式中操作符______________________________________

類型操作符格式名稱含義

*取正取表達武正值

算--〈表達式〉取負取表達式負值

表達式A乘兩式相乘

術整除兩式期

MODv表達式1>MOD<表達式2>取模兩式的值整除取余

操.〈表達式>Y表達式2>加兩式的值相加

*〈表達式1>-雷達式2>堿兩式的值相減

SHL〈表達式>SHL<常數)左移把表達式的值左移〈常數溶

SHRvajE>SHR<常觸右移把表達式的值右移〈常數冷

邏輯NOT、。丁逢達期邏謝E將表達式值各位取反

操A?vD〈女式AAXLK敵式邏輯與兩表達式值按位與

作OR〈表達式1>ORK表達式2>邏輯或兩表達式值才磁或

符XOR〈表達式l>XORv表達式2>邏輯異或兩表達式值才出立異或

EQ〈膽式1皿礴但相等相等結果為其否則為假

關NE〈循忒應上)不等不等結果為其否則為假

系LT〈表達式】>□?<表達式2>小千小千結果為真否則為假

操LE〈表達式l>LEv表達式2>小千等于不大于結果為真,否則為假

作GTv表達式1>GT法達式2>大于大于結果為其否則為假

符GE〈碼式1>GE法聞2>大于等千不小于結果為真,否則為假

回送SEGSEG3變量或標號〉段基址回送變量或拉曼的段基址

值OFFSETOFFSET<變量或標號》偏移量回送變量或掛聶的它地址

操LENGHTLEXGHT〈變量》元素個數回送整中元素個數*

作SIZESIZE<^^>字數回送變量中學節總數

符TYPETYPE<變量或標號》類型值回送變量或拉曼的類型值

PTR〈類型)PTR,變量或標號〉修改類型使用時重新設置變量或標號卻

類〈段前綴〉《表達式,段前綴使用前級所指定的段

型THISTHIS俵型〉指定類型重新定義當前存儲單元的類型

操SHORTJNIPSHORT海曼》短轉移說明語句中說明指定標號為埴標號

作HIGHHIGH<表達式>分離高字節.返回表達式的高S位

LOWLOWv表達式)

溫馨提示

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

評論

0/150

提交評論