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