(1)存儲模型說明偽指令
在使用簡化的段定義方式之前,必須使用存儲模式說明偽指令來描述源程序所采用的存儲模式。該偽指令說程序所使用的存儲模式,匯編程序?qū)⒂迷摯鎯δJ缴上鄳?yīng)的ASSUME和GROUP語句,同時也為其它的簡化段創(chuàng)建等價的預(yù)定義。
程序存儲模式說明偽指令的格式如下:
.MODEL 存儲模式[,語言類型] [,操作系統(tǒng)類型] [,堆棧類型]
程序可選的存儲模式有:TINY、SMALL、COMPACT、MEDIUM、LARGE、HUGE和FLAT。
偽指令.MODEL必須寫在源程序的首部,且只能出現(xiàn)一次,其前內(nèi)容只能是注釋。
如果用偽指令來指定程序所遵循的語言類型,那么,將不允許子程序的嵌套定義。
一、存儲模式
如果要用匯編語言編寫被高級語言調(diào)用的子程序,那么,該匯編程序的存儲模式必須與該高級語言編譯(或解釋)程序所使用的存儲模式相匹配。匯編語言程序所能使用的存儲模式、符號及其相關(guān)信息如表6.2所列。
在程序中,還可偽指令OPTION SEGMENT和SEGMENT來指定段的規(guī)模。
有關(guān)存儲模式的具體規(guī)定如下:
、TINY
在匯編程序MASM 6.11和TASM 4.0,該存儲類型是為編寫COM文件類型而設(shè)置的。程序員還可用匯編命令行選項/AT和連接命令選項/TINY來達(dá)到此目的。
、SMALL
所有的數(shù)據(jù)變量必須在一個數(shù)據(jù)段之內(nèi),所有的代碼也必須在一個代碼段之內(nèi)。在這種模型下,數(shù)據(jù)段寄存器的內(nèi)容保持不變,所有轉(zhuǎn)移也都是段內(nèi)轉(zhuǎn)移。
該存儲類型是獨(dú)立匯編語言源程序常用的存儲模型。
、MEDIUM
所有的數(shù)據(jù)變量必須在一個數(shù)據(jù)段之內(nèi),但代碼段可以有多個。在這種模型下,數(shù)據(jù)段寄存器的內(nèi)容保持不變,轉(zhuǎn)移可以是段間轉(zhuǎn)移。
、COMPACT
數(shù)據(jù)段可以有多個,但代碼段只能有一。
、LARGE
數(shù)據(jù)段和代碼段都可以有多個,但一個數(shù)組的字節(jié)數(shù)不能超過64KB。
、HUGE
數(shù)據(jù)段和代碼段都可以有多個,一個數(shù)組的字節(jié)數(shù)也可以超過64KB。
、FLAT
FLAT存儲模式在創(chuàng)建執(zhí)行文件時,將使該程序僅含一個包括程序數(shù)據(jù)和代碼的32位段,并且只能在80386及其以后的計算機(jī)系統(tǒng)中運(yùn)行。該程序的文件類型為EXE。
在使用該存儲模式之前,必須先用偽指令.386、.486或其它偽指令來說明更高性能的CPU類型。也就是說:FLAT模式僅在386及其以后CPU模式下才能使用。
在該程序中,所有代碼和數(shù)據(jù)位距的缺省值都是NEAR,子程序的類型也是NEAR,并且標(biāo)識符@CodeSize,@DataSize和@Model的值分別為:0、0和7。
在FLAT存儲模式下,程序?qū)⒉皇褂枚渭拇嫫鱂S和GS。匯編程序在處理說明語句“.MODEL FLAT”時,將自動生成下列段寄存器說明語句:
ASSUME CS:FLAT, DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR
當(dāng)然,程序員也可把該段寄存器說明語句寫在其指令序列之中。
二、語言類型
如C。
三、操作系統(tǒng)類型
OS_DOS是當(dāng)前唯一支持的選項值,也是該選項的缺省值。
四、堆棧類型
堆棧類型的值主要影響偽指令.STARTUP所生成的指令序列。該選項有二個可選值:NEARSTACK和FARSTACK。其中:NEARSTACK是該選項的缺省堆棧類型。
、NEARSTACK——堆棧段和數(shù)據(jù)段是同一段;
、FARSTACK——堆棧段和數(shù)據(jù)段是不同的段,且堆棧不在段組DGROUP中。
例如:
.MODEL SMALL, C, OS_DOS, FARSTACK
(2)具體的偽指令說明形式及其功能描述如下:
1、代碼段定義
.CODE
作用:說明其下面的內(nèi)容是代碼段中內(nèi)容。
2、堆棧段定義
.STACK [堆棧字節(jié)數(shù)]
其中,“堆棧字節(jié)數(shù)”可以不寫,其缺省值為1024B。
3、數(shù)據(jù)段定義
.DATA / .DATA? / .CONST
作用:說明其下面的內(nèi)容是數(shù)據(jù)段中的變量定義。
在一個源程序中,可以有多個偽指令.DATA定義的數(shù)據(jù)段,這就好象在源程序中定義多個同段名的數(shù)據(jù)段一樣。
偽指令.DATA?說明下面是一個未初始化數(shù)據(jù)段的開始,偽指令.CONST說明下面是一個常數(shù)數(shù)據(jù)段的開始。這二條偽指令很少使用,除非在與高級語言編寫的程序相結(jié)合時,為了遵守高級語言的某些約定,而需要特殊說明時才使用。
匯編程序在處理簡化的堆棧段和數(shù)據(jù)段定義時,它會自動地把偽指令.STACK、.DATA、.DATA?和.CONST所定義的段組合成一個段組。如果想定義一個獨(dú)立的、不與其它段組合在一起的數(shù)據(jù)段的話,那么,就可選用下面的數(shù)據(jù)段定義方式。
4、遠(yuǎn)程數(shù)據(jù)段定義
.FARDATA [段名] / .FARDATA? [段名]
其中:“段名”是可選項,如果不指定的話,則該段名就取其缺省段名。
作用:說明一個獨(dú)立的數(shù)據(jù)段。
偽指令.FARDATA?說明下面是一個未初始化的、獨(dú)立數(shù)據(jù)段的開始。
posted on 2007-07-16 20:46
merlinfang 閱讀(2344)
評論(0) 編輯 收藏 引用 所屬分類:
匯編語言