NASM語法

要彙編一個文件,你能夠如下面的格式執行一個命令:測試

nasm -f <format> <filename> [-o <output>]優化

好比, 會把文件'myfile.asm'彙編成'ELF'格式 的文件'myfile.o'.還有:this

nasm -f bin myfile.asm -o myfile.com操作系統

會把文件'myfile.asm'彙編成純二進制格式的文件'myfile.com'。命令行

想要以十六進制代碼的形式產生列表文件輸出,並讓代碼顯示在源代碼的左側, 使用'-l'選項並給出列表文件名,好比:設計

nasm -f coff myfile.asm -l myfile.lst調試

想要獲取更多的關於NASM 的使用信息,請輸入:orm

nasm -hthree

它同時還會輸出可使用的輸出文件格式,遊戲

若是你使用Linux 而且不清楚你的系統是'a.out'仍是'ELF',請輸入:

file nasm

(在nasm 二進制文件的安裝目錄下使用),若是系統輸出相似下面的信息:

nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1

那麼你的系統就是'ELF'格式的,而後你就應該在產生Linux 目標文件時使用選 項'-f elf',若是系統輸入相似下面的信息:

nasm: Linux/i386 demand-paged executable (QMAGIC)

或者與此類似的,你的系統是'a.out'的,那你應該使用'-f aout'(Linux 的'a.out'

系統好久之前就過期了,如今已很是少見。)

就像其餘的Unix 編譯器與彙編器,NASM 在碰到錯誤之前是不輸出任何信息的,所 以除了出錯信息你看不到任何其餘信息。

    2.1.1 '-o'選項:指定輸出文件的文件名。

NASM 會爲你的輸出文件選擇一個文件名;具體如何作取決於目標文件的格式,對 於微軟的目標文件格式('obj'和'win32'),它會去掉你的源文件名的'.asm'擴展 名(或者其餘任何你喜歡使用的擴展名,NASM 並不關心具體是什麼),並替換上

'obj'。對於Unix 的目標文件格式('aout','coff','elf'和'as86')它會替換成

'.o',  對於'rdf',它會使用'.rdf',還有爲'bin'格式,它會簡單地去掉擴展名,因此

'myfile.asm'會產生的一個輸出文件'myfile'。

若是輸出文件已經存在,NASM 會覆蓋它,除非它的文件名與輸入文件同名,在這種 狀況下,它會給出一個警告信息,並使用'nasm.out'做爲輸出文件的文件名。 在某些狀況下,上述行爲是不能接受的,因此,NASM 提供了'-o'選項,它能讓你指定 你的輸出文件的文件名,你使用'-o'後面緊跟你爲輸出文件取的名字,中間能夠加 空格也能夠不加。好比:

nasm -f bin program.asm -o program.com

nasm -f bin driver.asm -odriver.sys

請注意這是一個小寫的o,跟大寫字母O 是不一樣的,大寫的是用來指定須要傳遞的選 項的數目,請參閱2.1.15

   2.1.2 `-f'選項:指定輸出文件的格式。

若是你沒有對NASM 使用'-f'選項,它會本身爲你選擇一個輸出文件格式。在發佈的 NASM 版本中,缺省的輸出格式老是'bin';若是你本身編譯你的NASM,你能夠在編譯的 時候重定義'OF_DEFAULT'來選擇你須要的缺省格式。

就象'-o','-f'與輸出文件格式之間的空格也是可選的,因此'-f elf'和'-felf'都是 合法的。 全部可以使用的輸出文件格式的列表能夠經過運行命令'nasm -hf'獲得。

   2.1.3 `-l' 選項:  產生列表文件

若是你對NASM 使用了'-l'選項,後面跟一個文件名,NASM 會爲你產生一個源文件的列表 文件,在裏面,地址和產生的代碼列在左邊,實際的源代碼(包括宏擴展,除了那些指定 不須要在列表中擴展的宏,參閱4.3.9)列在右邊,好比:

nasm -f elf myfile.asm -l myfile.lst

   2.1.4 `-M'選項:  產生Makefile 依賴關係.

該選項能夠用來向標準輸出產生makefile 依賴關係,能夠把這些信息重定向到一個文件 中以待進一步處理,好比:

 

NASM -M myfile.asm > myfile.dep

   2.1.5 `-F'選項:  選擇一個調試格式

該選項能夠用來爲輸出文件選擇一個調試格式,語法跟-f 選項相冊,惟一不一樣的是它產 生的輸出文件是調試格式的。 一個具體文件格式的完整的可以使用調試文件格式的列表可經過命令'nasm -f <format> -y'

來獲得。 這個選項在缺省狀態下沒有被構建時NASM 。如何使用該選項的信息請參閱6.10

  2.1.6 `-g' 選項:使調試信息有效。

該選項可用來在指定格式的輸出文件中產生調試信息。

更多的信息請參閱2.1.5

  2.1.7 `-E' 選項:  把錯誤信息輸入到文件。

   在'MS-DOS'下,儘管有辦法,但要把程序的標準錯誤輸出重定向到一個文件仍是很是困 難的。由於NASM 常把它的警告和錯誤信息輸出到標準錯誤設備,這將致使你在文本編 輯器裏面很難捕捉到它們。

所以NASM 提供了一個'-E'選項,帶有一個文件名參數,它能夠把錯誤信息輸出到指定的 文件而不是標準錯誤設備。因此你能夠輸入下面這樣的命令來把錯誤重定向到文件:

nasm -E myfile.err -f obj myfile.asm

  2.1.8 `-s' 選項:  把錯誤信息輸出到'stdout'

'-s'選項能夠把錯誤信息重定向到'stdout'而不是'stderr',它能夠在'MS-DOS'下進行 重定向。想要在彙編文件'myfile.asm'時把它的輸出用管道輸出給'more'程序,能夠這樣:

nasm -s -f obj myfile.asm | more

請參考2.1.7 的'-E'選項.

 

   2.1.9 `-i'選項:  包含文件搜索路徑

當NASM 在源文件中看到'%include'操做符時(參閱4.6),它不只僅會在當前目錄下搜索給 出的文件,還會搜索'-i'選項在命令行中指定的全部路徑。因此你能夠從宏定義庫中 包含進一個文件,好比,輸入:

nasm -ic:\macrolib\ -f obj myfile.asm

 (一般,在 '-i'與路徑名之間的空格是容許的,而且可選的。)

NASM 更多的關注源代碼級上的徹底可移植性,因此並不理解正運行的操做系統對文件的 命名習慣;你提供給'-i'做爲參數的的字符串會被一字不差地加在包含文件的文件名前。 因此,上例中最後面的一個反斜槓是必要的,在Unix 下,一個尾部的正斜線也一樣是必要 的。

(固然,若是你確實須要,你也能夠不正規地使用它,好比,選項'-ifoo'會致使

'%incldue "bar.i'去搜索文件'foobar.i'...)

若是你但願定義一個標準的搜索路徑,好比像Unix 系統下的'/usr/include',你能夠在環境 變量NASMENV  中放置一個或多個'-i'(參閱2.1.19)

爲了與絕大多數C 編譯器的Makefile 保持兼容,該選項也能夠被寫成'-I'。

   2.1.10 `-p' 選項:  預包含一個文件

NASM 容許你經過'-p'選項來指定一個文件預包含進你的源文件。因此,若是運行:

nasm myfile.asm -p myinc.inc

跟在源文件開頭寫上'%include "myinc.inc"而後運行'nasm myfile.asm'是等效的。

爲和'-I','-D','-U'選項操持一致性,該選項也能夠被寫成'-P'

 

2.1.11 `-d'選項:  預約義一個宏。

就像'-p'選項給出了在文件頭放置'%include'的另外一種實現,'-d'選項給出了在文

件中寫'%define'的另外一種實現,你能夠寫:

nasm myfile.asm -dFOO=100

做爲在文件中寫下面一行語句的一種替代實現:

        %define FOO 100

 在文件的開始,你能夠取消一個宏定義,一樣,選項'-dFOO'等同於代碼'%define FOO'。 這種形式的操做符在選擇編譯時操做中很是有用,它們能夠用'%ifdef'來進行測試, 好比'-dDEBUG'。

爲了與絕大多數C 編譯器的Makefile 保持兼容,該選項也能夠被寫成'-D'。

 

   2.1.12 `-u' 選項:  取消一個宏定義。

   '-u'選項能夠用來取消一個由'-p'或'-d'選項先前在命令行上定義的一個宏定義。 好比,下面的命令語句:

       nasm myfile.asm -dFOO=100 -uFOO

會致使'FOO'不是一個在程序中預約義的宏。這在Makefile 中不一樣位置重載一個操 做時頗有用。 爲了與絕大多數C 編譯器的Makefile 保持兼容,該選項也能夠被寫成'-U'。

 

  2.1.13 `-e'選項:  僅預處理。

  NASM 容許預處理器獨立運行。使用'-e'選項(不須要參數)會致使NASM 預處理輸入 文件,展開全部的宏,去掉全部的註釋和預處理操做符,而後把結果文件打印在標 準輸出上(若是'-o'選項也被指定的話,會被存入一個文件)。

該選項不能被用在那些須要預處理器去計算與符號相關的表達式的程序中,因此 以下面的代碼:

       %assign tablesize ($-tablestart)

會在僅預處理模式中會出錯。

  2.1.14 `-a' 選項:  不須要預處理。

   若是NASM 被用做編譯器的後臺,那麼假設編譯器已經做完了預處理,並禁止NASM 的預處理功能顯然是能夠節約時間,加快編譯速度。'-a'選項(不須要參數),會讓NASM 把 它強大的預處理器換成另外一個什麼也不作的預處理器。

  2.1.15 `-On'選項:  指定多遍優化。

  NASM 在缺省狀態下是一個兩遍的彙編器。這意味着若是你有一個複雜的源文件須要 多於兩遍的彙編。你必須告訴它。使用'-O'選項,你能夠告訴NASM 執行多遍彙編。語法以下:

       (*)'-O0'嚴格執行兩遍優化,JMP 和Jcc 的處理和0.98 版相似,除了向後跳的JMP 是 短跳 轉,若是可能,當即數在它們的短格式沒有被指定的狀況下使用長格式。

       (*)'-O1'嚴格執行兩遍優化,但前向分支被彙編成保證可以到達的代碼;可能產生比

'-O0'更大的代碼,但在分支中的偏移地址沒有指定的狀況下彙編成功的機率更大,

       (*)'-On' 多編優化,最小化分支的偏移,最小化帶符號的當即數,當'strict'關鍵字

沒有用的時候重載指定的大小(參閱3.7),若是2<=n<=3,會有5*n 遍,而不是n 遍。

注意這是一個大寫的O,和小寫的o 是不一樣的,小寫的o 是指定輸出文件的格式,可參閱

  2.1.16 `-t'選項:  使用TASM 兼容模式。

  NASM 有一個與Borlands 的TASM 之間的受限的兼容格式。若是使用了NASM 的'-t'選項,就會產生下列變化:

        (*)本地符號的前綴由'.'改成'@@'

        (*)TASM 風格的以'@'開頭的應答文件能夠由命令行指定。這和NASM 支持的'-@resp' 風格是不一樣的。

        (*)擴號中的尺寸替換被支持。在TASM 兼容模式中,方括號中的尺寸替換改變了操 做 數的尺寸大小,方括號再也不支持NASM 語法的操做數地址。好比,'mov eax,[DWORD VAL]' 在TASM 兼容語法中是合法的。但注意你失去了爲指令替換缺省地址類型的能力。

        (*)'%arg'預處理操做符被支持,它同TASM 的ARG 操做符類似。

        (*) `%local'預處理操做符。

        (*) `%stacksize'預處理操做符。

        (*) 某些操做符的無前綴形式被支持。 (`arg', `elif',`else', `endif', `if',

         `ifdef', `ifdifi', `ifndef', `include',`local')

        (*) 還有不少...

須要更多的關於操做符的信息,請參閱4.9 的TASM 兼容預處理操做符指令。

  2.1.17 `-w'選項:  使彙編警告信息有效或無效。

  NASM 能夠在彙編過程當中監視不少的狀況,其中不少是值得反饋給用戶的,但這些狀況 還不足以構成嚴重錯誤以使NASM 中止產生輸出文件。這些狀況被以相似錯誤的形式 報告給用戶,但在報告信息的前面加上'warning'字樣。警告信息不會阻止NASM 產生 輸出文件並向操做系統返回成功信息。

   有些狀況甚至還要寬鬆:他們僅僅是一些值得提供給用戶的信息。因此,NASM 支持'-w' 命令行選項。它以使特定類型的彙編警告信息輸出有效或無效。這樣的警告類型是 以命名來描述的,好比,'orphan-labels',你能夠如下列的命令行選項讓此類警告信息 得以輸出:'-w+orphan-labels',或者以'-w-orphan-labels'讓此類信息不能輸出。 可禁止的警告信息類型有下列一些:

       (*)`macro-params'包括以錯誤的參數個數調用多行的宏定義的警告。這類警告信息

缺省狀況下是輸出的,至於爲何你可能須要禁止它,請參閱4.3.1。

       (*)`orphan-labels'包含源文件行中沒有指令卻定義了一個沒有結尾分號的label 的

警告。缺省情況下,NASM 不輸出此類警告。若是你須要它,請參閱3.1 的例子。

       (*)  'number-overflow'包含那些數值常數不符合32 位格式警告信息(好比,你很容易 打 了不少的F,錯誤產生了'0x7fffffffffff')。這種警告信息缺省情況下是打開的。

 

  2.1.18 `-v'選項:  打印版本信息。

輸入'NASM -v'會顯示你正使用的NASM 的版本號,還有它被編譯的時間。 若是你要提交bug 報告,你可能須要版本號。

 

  2.1.19 `NASMENV'環境變量。

若是你定義了一個叫'NASMENV'的環境變量,程序會被把它認做是命令行選項附加的一 部分,它會在真正的命令行以前被處理。你能夠經過在'NASMENV'中使用'-i'選項來定義包含文件的標準搜索路徑。 環境變量的值是經過空格符分隔的,因此值'-s ic:\nasmlib'會被看做兩個單獨的操 做。也正由於如此,意味着值'-dNAME='my name'不會象你預期的那樣被處理, 由於它會在空格符處被分開,NASM 的命令行處理會被兩個沒有意義的字符串'-dNAME="my'和 'name"'給弄混。 爲了解決這個問題,NASM 爲此提供了一個特性,若是你在'NASMENV'環境變量的第一個 字符處寫上一個非減號字符,NASM就會把這個字符看成是選項的分隔符。因此把環 境變量設成'!-s!-ic:\nasmlib'跟'-s -ic:\nasmlib'沒什麼兩樣,可是

'!-dNAME="my name"就會正常工做了。 這個環境變量之前叫作'NASM',從版本0.98.32 之後開始叫這個名字。

第三章 NASM 語言

----------------

   3.1 NASM 源程序行的組成。

就像不少其餘的彙編器,每一行NASM 源代碼包含(除非它是一個宏,一個預處理操做 符,或一個彙編器操做符,參況第4,5 章)下面四個部分的所有或某幾個部分: 一般,這些域的大部分是可選的;label,instruction,comment 存在或不存在都是允 許的。固然,operands 域會由於instruction 域的要求而必需存或必須不存在。 NASM 使用反斜線(\)做爲續行符;若是一個以一個反斜線結束,那第二行會被認爲 是前面一行的一部分。

NASM 對於一行中的空格符並無嚴格的限制:labels 能夠在它們的前面有空格,或 其餘任何東西。label 後面的冒號一樣也是可選的。(注意到,這意味着若是你想 要寫一行'lodsb',但卻錯誤地寫成了'lodab',這仍將是有效的一行,但這一行不作 任何事情,只是定義了一個label。運行NASM 時帶上命令行選項'-w+orphan-labels' 會讓NASM 在你定義了一個不以冒號結尾的label 時警告你。

labels 中的有效的字符是字母,數字,'-','$','#','@','~','.'和'?'。但只有字母

'.',(具備特殊含義,參閱3.9),'_'和'?'能夠做爲標識符的開頭。一個標識符還可

以加上一個'$'前綴,以代表它被做爲一個標識符而不是保留字來處理。這樣的話,

若是你想到連接進來的其餘模塊中定義了一個符號叫'eax',你能夠用'$eax'在

NASM 代碼中引用它,以和寄存器的符號區分開。

instruction 域能夠包含任何機器指令:Pentium 和P6 指令,FPU 指令,MMX 指令還有甚 至沒有公開的指令也會被支持。這些指令能夠加上前綴'LOCK','REP','REPE/REPZ' 或'REPNE'/'REPNZ',一般,支持顯示的地址尺寸和操做數尺寸前綴'A16','A32', 'O16'和'O32'。關於使用它們的一個例子在第九章給出。你也可使用段寄存器 名做爲指令前綴:代碼'es mov [bx],ax'等效於代碼'mov [es:bx],ax'。咱們推薦後一種語法。由於它和語法中的其它語法特性一致。可是對於象'LODSB'這樣的 指令,它沒有操做數,但仍是能夠有一個段前綴,對於'es lodsb'沒有清晰地語法 處理方式 在使用一個前綴時,指令不是必須的,像'CS','A32','LOCK'或'REPE'這樣的段前綴 以單獨出如今一行上,NASM 僅僅產生一個前綴字節。 做爲對實際機器指令的擴展,NASM  同時提供了必定數量的僞操做指令,這在3.2 節 詳細描述。

指令操做數可使用必定的格式:它們能夠是寄存器,僅僅以寄存器名來表示(比 如:'ax','bp','ebx','cr0':NASM 不使用'gas'的語法風格,在這種風格中,寄存器名 前必須加上一個'%'符號),或者它們能夠是有效的地址(參閱3.3),常數(3.4),或 表達式。

對於浮點指令,NASM 接受各類語法:你可使用MASM 支持的雙操做數形式,或者你 可使用NASM 的在大多數狀況下全用的單操做數形式。支持的因此指令的語法 細節能夠參閱附錄B。好比,你能夠寫:

                   fadd      st1                 ; this sets st0 := st0 + st1

                   fadd      st0,st1            ; so does this

                   fadd      st1,st0            ; this sets st1 := st1 + st0

                   fadd      to st1             ; so does this

幾乎全部的浮點指令在引用內存時必須使用如下前綴中的一個'DWORD',QWORD' 或'TWORD'來指明它所引用的內存的尺寸。

   3.2 僞指令。

僞指令是一些並非真正的x86 機器指令,但仍是被用在了instruction 域中的指 令,由於使用它們能夠帶來很大的方便。當前的僞指令'DB','DW','DD','DQ'和‘DT’,它們對應的未初始化指令是'RESB','RESW','RESD','RESQ'和'REST','INCBIN' 命令,'EQU'命令和'TIEMS'前綴。

   3.2.1 `DB'一類的僞指令:  聲明已初始化的數據。

        在NASM 中,`DB', `DW', `DD', `DQ'和`DT'常常被用來在輸出文件中聲明已初始化 的數據,你能夠多種方式使用它們:

                db      0x55                       ; just the byte 0x55

                db      0x55,0x56,0x57            ; three bytes in succession

                db      'a',0x55                ; character constants are OK

                db      'hello',13,10,'$'   ; so are string constants

                dw       0x1234                     ; 0x34 0x12

                dw       'a'                      ; 0x41 0x00 (it's just a number)

                dw       'ab'                     ; 0x41 0x42 (character constant)

                dw       'abc'                   ; 0x41 0x42 0x43 0x00 (string)

                dd      0x12345678                 ; 0x78 0x56 0x34 0x12

                dd      1.234567e20               ; floating-point constant

                dq      1.234567e20               ; double-precision float

                dt     1.234567e20               ; extended-precision float

'DQ'和'DT'不接受數值常數或字符串常數做爲操做數。

   3.2.2 `RESB'類的僞指令:  

聲明未初始化的數據。 `RESB', `RESW', `RESD', `RESQ' and `REST'被設計用在模塊的BSS 段中:它們聲明 未初始化的存儲空間。每個帶有單個操做數,用來代表字節數,字數,或雙字數 或其餘的須要保留單位。就像在2.2.7 中所描述的,NASM 不支持MASM/TASM 的扣留未 初始化空間的語法'DW ?'或相似的東西:如今咱們所描述的正是NASM  本身的方式。 'RESB'類僞指令的操做數是有嚴格的語法的,參閱3.8。

   3.2.3 `INCBIN':包含其餘二進制文件。

'INCBIN'是從老的Amiga 彙編器DevPac 中借過來的:它將一個二進制文件逐字逐句地

包含到輸出文件中。這能很方便地在一個遊戲可執行文件中包含中圖像或聲音數 據。它能夠如下三種形式的任何一種使用:

             incbin   "file.dat"                 ; include the whole file

             incbin   "file.dat",1024           ; skip the first 1024 bytes

             incbin   "file.dat",1024,512      ; skip the first 1024, and

                                                     ; actually include at most 512

   3.2.4 `EQU':  定義常數。

'EQU'定義一個符號,表明一個常量值:當使用'EQU'時,源文件行上必須包含一個label。 'EQU'的行爲就是把給出的label 的名字定義成它的操做數(惟一)的值。定義是不可更 改的,好比:

message              db        'hello, world'

        msglen              equ        $-message

把'msglen'定義成了常量12。'msglen'不能再被重定義。這也不是一個預自理定義: 'msglen'的值只被計算一次,計算中使用到了'$'(參閱3.5)在此時的含義。注意 ‘EQU’的操做數也是一個嚴格語法的表達式。(參閱3.8)

   3.2.5 `TIMES':   重複指令或數據。爲了與絕大多數C 編譯器的Makefile 保持兼容,該選項也能夠被寫成'-U'。

   2.1.13 `-e'選項:  僅預處理。

   NASM 容許預處理器獨立運行。使用'-e'選項(不須要參數)會致使NASM 預處理輸入 文件,展開全部的宏,去掉全部的註釋和預處理操做符,而後把結果文件打印在標 準輸出上(若是'-o'選項也被指定的話,會被存入一個文件)。

該選項不能被用在那些須要預處理器去計算與符號相關的表達式的程序中,因此 以下面的代碼:

        %assign tablesize ($-tablestart)

會在僅預處理模式中會出錯。

  2.1.14 `-a' 選項:  不須要預處理。

   若是NASM 被用做編譯器的後臺,那麼假設編譯器已經做完了預處理,並禁止NASM 的 預處理功能顯然是能夠節約時間,加快編譯速度。'-a'選項(不須要參數),會讓NASM 把 它強大的預處理器換成另外一個什麼也不作的預處理器。

  2.1.15 `-On'選項:  指定多遍優化。

  NASM 在缺省狀態下是一個兩遍的彙編器。這意味着若是你有一個複雜的源文件須要 多於兩遍的彙編。你必須告訴它。

       使用'-O'選項,你能夠告訴NASM 執行多遍彙編。語法以下:

       (*)'-O0'嚴格執行兩遍優化,JMP 和Jcc 的處理和0.98 版相似,除了向後跳的JMP 是 短跳 轉,若是可能,當即數在它們的短格式沒有被指定的狀況下使用長格式。

       (*)'-O1'嚴格執行兩遍優化,但前向分支被彙編成保證可以到達的代碼;可能產生比

'-O0'更大的代碼,但在分支中的偏移地址沒有指定的狀況下彙編成功的機率更大,

       (*)'-On' 多編優化,最小化分支的偏移,最小化帶符號的當即數,當'strict'關鍵字 沒有用的時候重載指定的大小(參閱3.7),若是2<=n<=3,會有5*n 遍,而不是n 遍。 注意這是一個大寫的O,和小寫的o是不一樣的,小寫的o 是指定輸出文件的格式,可參閱

2.1.1

  2.1.16 `-t'選項:  使用TASM 兼容模式。

  NASM 有一個與Borlands 的TASM 之間的受限的兼容格式。若是使用了NASM 的'-t'選項, 就會產生下列變化:

       (*)本地符號的前綴由'.'改成'@@'

       (*)TASM 風格的以'@'開頭的應答文件能夠由命令行指定。這和NASM 支持的'-@resp'

風格是不一樣的。

       (*)擴號中的尺寸替換被支持。在TASM 兼容模式中,方括號中的尺寸替換改變了操 做 數的尺寸大小,方括號再也不支持NASM 語法的操做數地址。好比,'mov eax,[DWORD VAL]' 在TASM 兼容語法中是合法的。但注意你失去了爲指令替換缺省地址類型的能力。

        (*)'%arg'預處理操做符被支持,它同TASM 的ARG 操做符類似。

        (*) `%local'預處理操做符。

        (*) `%stacksize'預處理操做符。

        (*) 某些操做符的無前綴形式被支持。 (`arg', `elif',`else', `endif', `if',

         `ifdef', `ifdifi', `ifndef', `include',`local')

        (*) 還有不少...

須要更多的關於操做符的信息,請參閱4.9 的TASM 兼容預處理操做符指令。

  2.1.17 `-w'選項:  使彙編警告信息有效或無效。

  NASM 能夠在彙編過程當中監視不少的狀況,其中不少是值得反饋給用戶的,但這些狀況 還不足以構成嚴重錯誤以使NASM 中止產生輸出文件。這些狀況被以相似錯誤的形式報告給用戶,但在報告信息的前面加上'warning'字樣。警告信息不會阻止NASM 產生 輸出文件並向操做系統返回成功信息。

   有些狀況甚至還要寬鬆:他們僅僅是一些值得提供給用戶的信息。因此,NASM 支持'-w' 命令行選項。它以使特定類型的彙編警告信息輸出有效或無效。這樣的警告類型是 以命名來描述的,好比,'orphan-labels',你能夠如下列的命令行選項讓此類警告信息 得以輸出:'-w+orphan-labels',或者以'-w-orphan-labels'讓此類信息不能輸出。

可禁止的警告信息類型有下列一些:

        (*)`macro-params'包括以錯誤的參數個數調用多行的宏定義的警告。這類警告信息

缺省狀況下是輸出的,至於爲何你可能須要禁止它,請參閱4.3.1。

       (*)`orphan-labels'包含源文件行中沒有指令卻定義了一個沒有結尾分號的label 的

警告。缺省情況下,NASM 不輸出此類警告。若是你須要它,請參閱3.1 的例子。

        (*)  'number-overflow'包含那些數值常數不符合32 位格式警告信息(好比,你很容易 打  了不少的F,錯誤產生了'0x7fffffffffff')。這種警告信息缺省情況下是打開的。

  2.1.18 `-v'選項:  打印版本信息。

    輸入'NASM -v'會顯示你正使用的NASM 的版本號,還有它被編譯的時間。 若是你要提交bug 報告,你可能須要版本號。

  2.1.19 `NASMENV'環境變量。

若是你定義了一個叫'NASMENV'的環境變量,程序會被把它認做是命令行選項附加的一 部分,它會在真正的命令行以前被處理。你能夠經過在'NASMENV'中使用'-i'選項來定 義包含文件的標準搜索路徑。 環境變量的值是經過空格符分隔的,因此值'-s ic:\nasmlib'會被看做兩個單獨的操 做。也正由於如此,意味着值'-dNAME='my name'不會象你預期的那樣被處理,由於它 會在空格符處被分開,NASM 的命令行處理會被兩個沒有意義的字串'-dNAME="my'和 'name"'給弄混。 爲了解決這個問題,NASM 爲此提供了一個特性,若是你在'NASMENV'環境變量的第一個 字符處寫上一個非減號字符,NASM 就會把這個字符看成是選項的分隔符。因此把環 境變量設成'!-s!-ic:\nasmlib'跟'-s -ic:\nasmlib'沒什麼兩樣,可是 '!-dNAME="my name"就會正常工做了。

這個環境變量之前叫作'NASM',從版本0.98.32 之後開始叫這個名字。

相關文章
相關標籤/搜索