1.定義數(shù)據(jù)偽指令
該類偽指令用來定義存貯空間及其所存數(shù)據(jù)的長度。
DB——定義字節(jié),即每個(gè)數(shù)據(jù)是1個(gè)字節(jié)。
DW——定義字,即每個(gè)數(shù)據(jù)占1個(gè)字(2個(gè)字節(jié))。
DD——定義雙字,即每個(gè)數(shù)據(jù)占2個(gè)字。低字部分在低地址,高字部分在高地址。
DQ——定義4字長,即每個(gè)數(shù)據(jù)占4個(gè)字。
DT——定義10個(gè)字節(jié)長,用于壓縮式十進(jìn)制數(shù),
例如:
DATA1DB5,6,8,100表示從DATA1單元開始,連續(xù)存放5,6,8,100,共占4個(gè)字節(jié)地址。
DATA2 DW 7,287
表示從DATA2單元開始,連續(xù)存放7,287兩個(gè)字,共占4個(gè)字節(jié)地址。定義一個(gè)存貯區(qū)時(shí),也可以不放數(shù)據(jù),如:
TABLE DB?
表示在TABLE單元中存放的內(nèi)容是隨機(jī)的。當(dāng)一個(gè)定義的存貯區(qū)內(nèi)的每個(gè)單元要放置同樣的數(shù)據(jù)時(shí),可用DUP操作符,
如:
BUFFER DB 100DUP(0)
表示以BUFFER為首地址的100個(gè)字節(jié)中存放00H數(shù)據(jù)。
2. 符號(hào)定義偽指令EQU
EQU偽指令給符號(hào)定義一個(gè)值。在程序中,凡是出現(xiàn)該符號(hào)的地方,匯編時(shí)均用其值代替,
如:
TIMES EQU 50
DATA DB TIMESDUP(?)
上述兩個(gè)語句實(shí)際等效于如下一條語句:DATA DB 50DUP(?)
3. 包含偽指令I(lǐng)NCLUDE
包含偽指令I(lǐng)NCLUDE用來在程序中指明包含另一個(gè)程序。如果在用戶所編寫的程序中,某些地方需要這種轉(zhuǎn)換程序,在該處寫一條偽指令:
INCLUDE B:CONVERT.LIB
即可。匯編程序在匯編時(shí),一旦遇到該指令,就在B盤上尋找CONVERT.LIB程序,找到后就將這個(gè)程序包含在用戶程序中。
4. 段定義偽指令SEGMENT和ENDS
一般來說,一個(gè)完整的匯編源程序由3個(gè)段組成,即堆棧段、數(shù)據(jù)段和代碼段。段定義偽指令可將源程序劃分成若干 段,以便生成目的代碼和連接時(shí)將各同名段進(jìn)行組合。
段定義偽指令一般格式為
段名SEGMENT[定位類型][組合類型][類別]
… 段名 ENDS
SEGMENT和ENDS應(yīng)成對(duì)使用,缺一不可。
偽指令各部分書寫規(guī)定如下:
①段名:段名是不可省略的。其他是可選項(xiàng),是賦予段名的屬性,可以省略。段名是給定義的段所起的名稱,
例如:
STACK SEGMENT STACK
DW 20DUP(?)
STACK ENDS
②定位類型:定位類型表示該段起始地址位于何處,它可以是字節(jié)型的(BYTE),即段起始地址可位于任何地方;可以是字型(WORD)的,段起始地址必須
位于偶地址,即地址最后一位是0(二進(jìn)制的);也可以是節(jié)型(PARA)的,即段起始地址必須能被16除盡;也可以是頁型的(PAGE),即段起始
地址可被256除盡(一頁為256個(gè)字節(jié));也可以缺省。缺省時(shí),段起始地址便定位為PARA型的。
③組合類型:組合類型用于告訴連接程序,該段和其他段的組合關(guān)系。連接程序可以將不同模塊的同名段進(jìn)行組合。根據(jù)組合類型,可將各段連接在一起,
或重疊在一起,
組合類型有:
NONE——表明本段與其他段邏輯上不發(fā)生關(guān)系,當(dāng)組合類型項(xiàng)省略時(shí),便指定為這一組合類型。
PUBLIC——表明該段與其他模塊中用PUBLIC說明的同名段連接成一個(gè)邏輯段,運(yùn)行時(shí)裝入同一個(gè)物理段中,使用同一個(gè)段地址。
STACK——每個(gè)程序模塊中,必須有一個(gè)堆棧段。
COMMON——表明該段與其他模塊中由COMMON說明的所有同名段連接時(shí),被重疊放在一起,其長度是同名段中最長者的長度。
MEMORY——由MEMORY說明的段。在連接時(shí),它被放在所裝載程序的最后存貯區(qū)(最高地址)。
④類別:是用單引號(hào)括起來的字符串,以表明該段的類別,如代碼段(CODE)、數(shù)據(jù)段(DATA),堆棧段(STACK)等。
例如有兩個(gè)模塊: ;
模塊1
STACK SEGMENT STACK
DW 200DUP(?)
STACK ENDS
DATA SEGMENT COMMON
…DATA ENDS
CODE SEGMENT PUBLIC
…CODE ENDS
模塊2
STACK SEGMENT STACK
DW 30DUP(?)
STACK ENDS
DATA SEGMENT COMMON
…DATA ENDS
CODE SEGMENT PUBLIC
…CODE ENDS
END

5. 設(shè)定段寄存器偽指令A(yù)SSUME ASSUME——段寄存器定義偽指令。它可通知匯編程序,哪一個(gè)段寄存器是該段的段寄存器,以便對(duì)使用變量或標(biāo)號(hào)的指令匯編出正確的目的代碼, 其格式為: ASSUME段寄存器:段名[,段寄存器:段名,……] 例如: CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX …CODE ENDS
6.定義過程的偽指令PROC和ENDP
在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個(gè)過程(相當(dāng)于一個(gè)子程序)。它可以被別的程序調(diào)用(用CALL指令)或由JMP指令轉(zhuǎn)移到此執(zhí)行;也可以由程序
順序執(zhí)行;也可以作為中斷處理程序,在中斷響應(yīng)后轉(zhuǎn)此執(zhí)行。一個(gè)過程由偽指令PROC和ENDP來定義,
其格式為
過程名 PROC[類型]
… 過程體
RET
過程名 ENDP
例如 :一個(gè)延時(shí)100ms的子程序,其過程可定義如下:
SOFTDLY PROC
MOV BL,10
;內(nèi)環(huán)延時(shí)10ms
DELAY: MOV CX,2801
WAIT: LOOP WAIT
DEC BL
JNZ DELAY
RET
SOFTDLY ENDP
為了不破壞主程序的工作狀態(tài),通常在過程中應(yīng)保護(hù)該過程所用到的通用寄存器的內(nèi)容。考慮到這種情況過程應(yīng)改成:
SOFTDLY PROC
PUSH BX
PUSH CX
MOV BL,10
;內(nèi)環(huán)延時(shí)10ms
DELAY:MOV CX,2801
WAIT: LOOP WAIT
DEC BL
JNZ DELAY
POP CX
POP BX
RET
SOFTDLY ENDP
遠(yuǎn)過程調(diào)用時(shí)被調(diào)用過程必定不在本段內(nèi)。
例如,有兩個(gè)程序段,
其結(jié)構(gòu)如下:
CODE1 SEGMENT ASSUME CS:CODE1 … FARPROC RPOC FAR … RET … FARPROC ENDP CODE1 ENDSCODE2 SEGMENT ASSUME CS:CODE2 … CALL FARPROC … CALL NEARPROC … NEARPROC PROC NEAR … RET NEARPROC ENDP
CODE2 ENDS 7. 模塊間通信的偽指令PUBLIC,EXTRN PUBLIC和EXTRN偽指令可完成此功能,其一般格式為 PUBLIC 名稱[,名稱,……] EXTRN 名稱:類型[,名稱:類型……]
例如:
目的模塊1
EXTRN VAR1:WORD,OUTPUT:FAR
EXTRN VAR2:WORD
LOCAL –DATA SEGMENT
…LOCAL –DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:LOCAL --DATA
START: MOV AX,LOCAL --DATA
MOV DS,AX;初始化DS… MOV AX,SE :GVAR1
MOV ES,AX;初始化ES
ADD BX,ES:VAR1
… MOV AX,SEGVAR2
MOV ES,AX
SUB ES:VAR2,50
… JMP OUTPUT;段間跳轉(zhuǎn)
…CODE ENDS
END START;目的模塊2
PUBLIC VAR1
EXTDATA1 SEGMENT ;定義EXTDATA1數(shù)據(jù)段
…VAR1: DW? ;定義變量VAR1
EXTDATA1 ENDS
… END
;
目的模塊3
PUBLIC VAR2
EXTDATA2 SEGMENT ;定義EXTDATA2數(shù)據(jù)段
… VAR2: DW?
… EXTDATA2 ENDS
END
PUBLIC OUTPUT
ROUTINE SEGNENTASSUME CS:ROUTINE
…OUTPUT LABEL FAR ;定義OUTPUT標(biāo)號(hào)
…ROUTIN EENDS
END
8. 條件偽指令 匯編語言提供了一組條件偽操作,用來指示匯編程序應(yīng)該測(cè)試的條件,使匯編程序能根據(jù)測(cè)試結(jié)果有選擇 地對(duì)源程序中的語句進(jìn)行匯編處理。 所有條件偽操作都采用如下格式: IF××××[〈表達(dá)式〉] … ELSE … ENDIF
9.宏命令偽指令
在匯編語言書寫的源程序中,若有的程序段要多次使用,為了簡(jiǎn)化程序書寫,該程序段可以用一條宏命令來代替,而匯編程序匯編到該宏命令時(shí),
仍會(huì)產(chǎn)生源程序所需的代碼。
例如:
MOV CL,4
SAL AL,CL
若該兩條指令在程序中要多次使用,就可以用一條宏命令來代替。當(dāng)然在使用宏命令前首先要對(duì)宏命令進(jìn)行定義,
例如:
SHIFT MACRO
MOV CL,4
SAL AL,CL
ENDM
這樣定義以后,凡是要使AL中內(nèi)容左移4位的操作都可用一條宏命令SHIFT來代替。
宏命令的一般格式為宏
命令名MACRO[形式參量表]…宏體
ENDMMACRO是宏定義符,是和ENDM宏定義結(jié)束符成對(duì)出現(xiàn)的。這兩者之間就是宏體,也就是該宏命令要代替的那一段程序,
例如:
GADD MACRO X,Y,ADD
MOV AX,Y
ADD AX,Y
MO VADD,AX
ENDM
其中X,Y,ADD都是形式參量。調(diào)用時(shí),下面宏命令書寫格式是正確的:
GADD DATA1,DATA2,SUM
這里DATA1,DATA2,SUM是實(shí)參量。實(shí)際上與該宏命令對(duì)應(yīng)的源程序?yàn)椋?
MOV AX,DATA1
ADD AX,DATA2
MOV SUM,AX
10.匯編結(jié)束偽指令END
該偽指令表示源程序的結(jié)束,令匯編程序停止匯編。因此,任何一個(gè)完整的源程序均應(yīng)有END指令,
其一般格式為
END[表達(dá)式]
其中表達(dá)式表示該匯編程序的啟動(dòng)地址。
例如:
… END START
則表明該程序的啟動(dòng)地址為START。
