弄懂了前面幾篇關(guān)于基礎(chǔ)的文章,下面就開始我們真正的匯編之旅了,,在這一篇中我們著重來強(qiáng)調(diào)下匯編語言的偽指令,。偽指令是匯編語言程序設(shè)計(jì)中的一個(gè)主要的部分,屬于控制命令,,在匯編語言中的數(shù)據(jù)定義,、存儲(chǔ)單元分配、指示程序結(jié)果等功能,。
首先,,我想很多人對(duì)偽指令語句與指令語句的區(qū)別不是太清楚吧,,兩者的區(qū)別在于:偽指令由匯編程序解釋后完成相應(yīng)的操作,會(huì)變厚不產(chǎn)生目標(biāo)機(jī)器代碼,,進(jìn)過匯編后的目標(biāo)程序中,偽指令碼已經(jīng)不復(fù)存在,。指令語句由匯編程序翻譯成機(jī)器目標(biāo)代碼,,一定有對(duì)應(yīng)的目標(biāo)代碼,并且只能在程序運(yùn)行時(shí)才能由CPU完成其操作,。
一,、符號(hào)定義偽指令
1】、等值偽指令EQU
偽指令格式: 符號(hào)名 EQU 表達(dá)式
功能:用一個(gè)符號(hào)名代替表達(dá)式的值,,是符號(hào)名與表達(dá)式等價(jià),。
2】、等號(hào)偽指令“=”
偽指令格式: 符號(hào)名 = 表達(dá)式
等號(hào)偽指令“=”的功能,、含義和表達(dá)式的內(nèi)容等都與等值偽指令EQU基本相同,,其主要不同點(diǎn)是:
a、等號(hào)偽指令允許重新定義,。
b,、等號(hào)偽指令后的表達(dá)式不能是指令助記符或關(guān)鍵字。
二,、數(shù)據(jù)定義偽指令
1】,、DB偽指令
偽指令格式: 變量名 DB, 表達(dá)式1[,,表達(dá)式2][,,表達(dá)式3....]
功能: 定義字節(jié)變量,每個(gè)表達(dá)式的值占一個(gè)字節(jié),。
字節(jié)的值域?qū)τ跓o符號(hào)整數(shù)為0--255,, 對(duì)于有符號(hào)整數(shù)位-128--127, 個(gè)表達(dá)式之間用逗號(hào)隔開,,變量名為各表達(dá)式中第一項(xiàng)數(shù)據(jù)在存儲(chǔ)單元的符號(hào)地址,,第一項(xiàng)數(shù)據(jù)后面的各項(xiàng)數(shù)據(jù)的單元地址依次在該符號(hào)地址上增一,如果某項(xiàng)數(shù)據(jù)的初值為“?”,,則對(duì)應(yīng)字節(jié)單元將不賦初值,,其內(nèi)容為不確定值。
2】,、DW偽指令
偽指令格式: 變量名 DW,, 表達(dá)式1[,表達(dá)式2][,,表達(dá)式3....]
功能: 定義字變量,,每個(gè)表達(dá)式的值占一個(gè)字,。
字節(jié)的值域?qū)τ跓o符號(hào)整數(shù)為0--65535, 對(duì)于有符號(hào)整數(shù)位-32768--32767,, 個(gè)表達(dá)式之間用逗號(hào)隔開,,變量名為各表達(dá)式中第一項(xiàng)數(shù)據(jù)在存儲(chǔ)單元的符號(hào)地址,第一項(xiàng)數(shù)據(jù)后面的各項(xiàng)數(shù)據(jù)的單元地址依次在該符號(hào)地址上增一,,如果某項(xiàng)數(shù)據(jù)的初值為“?”,,則對(duì)應(yīng)字節(jié)單元將不賦初值,其內(nèi)容為不確定值,。
3】,、DD偽指令
其格式與功能同DB/DW,不同點(diǎn)是它定義的是雙字變量,。
4】,、DQ偽指令
其格式與功能同DB/DW,不同點(diǎn)是它定義的是四字變量,。
5】,、DT偽指令
其格式與功能同DB/DW,不同點(diǎn)是它定義的是五字變量,。
三,、LABEL屬性定義偽指令
偽指令格式: 名稱 LABEL 類型
功能:為當(dāng)前的變量或標(biāo)號(hào)定義一個(gè)新的類型,其功能同PTR運(yùn)算符
LABEL指令通常與指令語句或數(shù)據(jù)定義偽指令連用,,這時(shí)名稱就為與之連用的數(shù)據(jù)定義偽指令語句或指令語句中的變量或標(biāo)號(hào)定義一個(gè)新的變量名或標(biāo)號(hào),,以便補(bǔ)充和設(shè)置與之連用的變量或標(biāo)號(hào)的類型屬性,因此,,LABEL偽指令的名稱同樣具有段,、偏移量和類型3個(gè)屬性。
四,、SEGMENT/ENDS段定義偽指令
之前我們都知道Intel 8086/8088 CPU是通過4個(gè)段寄存器按分段尋址的方式來方位1MB的存儲(chǔ)器的,,因此匯編語言源程序也是按段來組織的,一個(gè)程序可以由多個(gè)邏輯段組成,,分別來存放數(shù)據(jù),、作堆棧使用、存放主程序,、存放子程序等,,而構(gòu)造這些段用段定義偽指令SEGMENT/ENDS。
段定義偽指令格式:
段名 SEGMENT [定位類型][組合類型][類別名]
.... ;段的主體部分
段名 ENDS
功能:用于把程序分成若干個(gè)邏輯段,,這些邏輯段根據(jù)其用途的不同分為代碼段,、數(shù)據(jù)段、堆棧段和附加段,。
1,、定位類型
定位類型有5中:PARA,、PAGE、DWORD,、BYTE,、WORD。
2,、組合類型組合類型指定段與段之間的連接和定位關(guān)系,,組合類型有6種:
NONE、PUBLIC,、COMMON、STACK,、AT,、MEMORY
3、類別名
五,、ASSUME段尋址偽指令
當(dāng)CPU要訪問存儲(chǔ)器中某個(gè)存儲(chǔ)單元時(shí),,要把邏輯地址轉(zhuǎn)換成物理地址,那么要由某個(gè)段寄存器提供該存儲(chǔ)單元所在邏輯段的段基值,,因此,,要指定邏輯段與CPU中各段寄存器之間的關(guān)系,而段尋址偽指令A(yù)SSUME就是用來指示匯編程序?qū)?yīng)關(guān)系的,。
段尋址偽指令格式:ASSUME 段寄存器名:段名,, 段寄存器名:段名, ....
其中段寄存器為CS, DS, SS, ES中的一個(gè),,段名是由SEGMENT/ENDS定義的段名,。
六、PROC/ENDP過程定義偽指令
如果你懂一門最基本的語言,,比如C語言的話,,那這個(gè)偽指令應(yīng)該會(huì)很好理解的,它跟高級(jí)語言的模塊化程序設(shè)計(jì)有點(diǎn)像,,就是一個(gè)子函數(shù),,這樣才能使我們的程序?qū)崿F(xiàn)“高聚合,低耦合”,。
過程定義偽指令格式:
過程名 PROC [NEAR/FAR]
.....
RET
.....
過程名 ENDP
這里的過程名就是在匯編程序中CALL的操作數(shù),,每一個(gè)過程中肯定要有一個(gè)返回指令RET,它可以在過程的任何位置,。一個(gè)過程也不一定只有一條返回指令,。
七、ORG定位偽指令和$當(dāng)前位置計(jì)數(shù)器
當(dāng)前位置計(jì)數(shù)器是一個(gè)功能很強(qiáng)大的偽指令,,例如:
DATA SEGMENT
STRING DB 'YangZhiSen'
LENG DB $-STRING
DATA ENDS
在上例中,,有對(duì)$的使用,,LENG的值就為字符串STRING的長(zhǎng)度,
對(duì)于ORG定位偽指令的格式:
ORG 表達(dá)式
功能:將表達(dá)式的值賦給當(dāng)前位置計(jì)數(shù)器,,ORG語句后面的指令或數(shù)據(jù)以表達(dá)式給定的值作起始偏移量,。
八、TITLE標(biāo)題偽指令
標(biāo)題偽指令格式:
TITLE 標(biāo)題名
功能:給程序指定一個(gè)標(biāo)題,,以便在列表文件中每一頁(yè)的第1行都顯示這個(gè)標(biāo)題,。
九、END程序結(jié)束偽指令
程序結(jié)束偽指令格式:
END 起始地址
功能:標(biāo)志源程序結(jié)束,,并指定程序運(yùn)行時(shí)的起始地址,,即一方面告訴編譯程序END偽指令后面的任何語句在匯編時(shí)都被省去,另一方面又告訴匯編程序在程序裝入內(nèi)存時(shí)根據(jù)起始地址的段基值和偏移量分別自動(dòng)裝入CS和IP中,。
十,、PUBLIC和EXTRN模塊連接偽指令
因?yàn)檫@個(gè)我暫且未用到,所以有待以后再說,。