指示符是由匯編程序產(chǎn)生的而不是由CPU產(chǎn)生。它們通常用來要么指示匯編程序做什么要么提示匯編程序什么。它們并不翻譯成機(jī)器代碼。指示符普遍的應(yīng)用有:
1、定義常量
2、定義用來儲存數(shù)據(jù)的內(nèi)存
3、將內(nèi)存組合成段
4、有條件地包含源代碼
5、包含其它文件
NASM代碼像C一樣要通過一個預(yù)處理程序。它擁有許多和C一樣的預(yù)處理程序。但是,NASM 的預(yù)處理的指示符以%開頭而不是像C一樣以#開頭。
equ 指示符
equ指示符可以用來定義一個符號。符號被命名為可以在匯編程序里使用的常量。格式是:
symbol equ value
符號的值以后不可以再定義。
%define 指示符
這個指示符和C中的#define非常相似。它通常用來定義一個宏常量,像在C里面一樣。
%define SIZE 100
mov eax, SIZE
上面的代碼定義了一個稱為SIZE的宏通過使用一個MOV指令。宏在兩個方面比符號要靈活。宏可以被再次定義而且可以定義比簡單的常量數(shù)值更大的值。
數(shù)據(jù)指示符
數(shù)據(jù)指示符使用在數(shù)據(jù)段中用來定義內(nèi)存空間。保留內(nèi)存有兩種方法。第一種方法僅僅為數(shù)據(jù)定義空間;第二種方法在定義數(shù)據(jù)空間的同時給與一個初始值。第一種方法使用RESX指示符中的一個。X可由字母替代,字母由需要儲存的對象的大小來決定。表1.3給出了可能的值。
第二種方法(同時定義一個初始值)使用DX指示符中的一個。X可以由字母替代,字母的值與RESX里的值一樣。使用變量來標(biāo)記內(nèi)存位置是非常普遍的。變量使得在代碼中指向內(nèi)存位置變得容易。下面是幾個例子:
雙引號和單引號被同等對待。連續(xù)定義的數(shù)據(jù)儲存在連續(xù)的內(nèi)存中。也就是說,字L2就儲存在L1的后面。內(nèi)存的順序可以同樣被定義。
指示符DD可以用來定義整形和單精度的浮點(diǎn)數(shù)常量6。但是,DQ指示符僅僅可以用來定義雙精度的數(shù)常量。
對于大的序列,NASM 的TIMES 指示符常常非常有用。這個指示符每次都重復(fù)它的操作對象一個指定的次數(shù)。例如:
記住變量可以用來表示代碼中的數(shù)據(jù)。變量的使用方法有兩種。如果一個平常的變量被使用了,它被解釋為數(shù)據(jù)的地址(或偏移)。如果變量被放置在方括號([])中,它就被解釋為在這個地址中的數(shù)據(jù)。換句話說,你必須把變量當(dāng)作一個指向數(shù)據(jù)的指針而方括號引用這個指針就像*號在C中一樣。(MASM/TASM使用的是另外一個慣例。)在32位模式下,地址是32位。這兒有幾個例子:
例子的第7行展示了NASM 一個重要性能。匯編程序并不保持跟蹤變量的數(shù)據(jù)類型。它由程序員來決定來保證他(或她)正確使用了一個變量。隨后它一般將數(shù)據(jù)的地址儲存到寄存器中,然后像在C中一樣把寄存器當(dāng)一個指針變量來使用。同樣,沒有檢查使得指針能正確使用。以這種方式,匯編程序跟C相比有更易出錯的傾向。
考慮下面的指令:
mov [L6], 1 ; 儲存1到L6中
這條語句產(chǎn)生一個operation size not specified(操作大小沒有指定)的錯誤。為什么?因?yàn)閰R編程序不知道是把1當(dāng)作一個字節(jié),還是字,或是雙字來儲存。為了修正這個,加一個大小指定:
mov dword [L6], 1 ; 儲存1到L6中
這個告訴匯編程序把1儲存在從L6開始的雙字中。另一些大小指定為:BYTE(字節(jié)),WORD(字),QWORD(四字)和TWORD(十字節(jié))。
更多建議: