nasm使用簡易教程


 

Nasm中文手冊
  
--------------------------------------------------------------------------------
第一章: 簡介
-----------------------
  1.1 什么是NASM
      NASM是一個為可移植性與模塊化而設計的一個80x86的匯編器。它支持相當多的目標文件格式,包括Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'',微軟16位的''OBJ''和''Win32''。它還可以輸出純二進制文件。它的語法設計得相當的簡潔易懂,和Intel語法相似但更簡單。它持''Pentium'',''P6'',''MMX'',''3DNow!'',

 ''SSE'' and ''SSE2''指令集。
     
      1.1.1 為什么還需要一個匯編器?
      NASM當初被設計出來的想法是''comp.lang.asm.x86''(或者可能是''alt.lang.asm'' ,我忘了),從本質上講,是因為沒有一個好的免費的x86系例的匯編器可以使用,所以,必須有人來寫一個。      

      (*)''a86''不錯,但不是免費的,而且你不可能得到32位代碼編寫的功能,除非你付費,它只使用在dos上。 (*) ''gas''是免費的,而且在dos下和unix下都可以使用,但是它是作為''gcc''的一個后台而設計的,並不是很好,''gcc''一直就提供給它絕對正確的代碼,所以它的錯誤檢測功能相當弱,還有就是對於任何一個想真正利用它寫點東西的人來講,它的語法簡直太可怕了,並且你無法在里面寫正確的16位代碼。 (*) ''as86''是專門為Minix和Linux設計的,但看上去並沒有很多文檔可以參考。 

       (*) ''MASM''不是很好,並且相當貴,還且只能運行在DOS下。 (*) ''TASM''好一些,但卻極入與MASM保持兼容,這就意味着無數的偽操作碼和繁瑣的約定,並且它的語法本質上就是MASM的,伴隨着的就是一些自相矛盾和奇怪的東西。它也是相當貴的,並且只能運行在DOS下。

      所以,只有NASM才能使您愉悅得編程。目前,它仍在原型設計階段-我們不期望能夠超越所有的這些匯編器。但請您發給我們bug報告,修正意見,和其他有用的信息,還有其他任何你手頭有的對我們有用的信息(感謝所有已經這樣在做了的人們),我們還會不斷地改進它。

      1.1.2 許可條件
      請閱讀作為NASM發布的一部分的文件''Licence'',只有在該許可條件下你才可以使用NASM。

  1.2 聯系信息
當前版本的NASM(0.98.08)由一個開發小組在維護,你可以從''nasm-devel''郵件列表中得到(看下面的鏈接),如果你想要報告bug,請先閱讀10.2節     

NASM有一個主頁:''http://www.web-sites.co.uk/nasm'',更多的信息還可以在“http://nasm.2y.net/''上獲取。     

      最初的作者你可以通過email:`jules@dsf.org.uk''和`anakin@pobox.com''和他們聯系,但后來的開發小組並不在其中。最新的NASM發布被上傳至官方網站`http://www.web-sites.co.uk/nasm''和`ftp.kernel.org'',`ibiblio.org''公告被發布至`comp.lang.asm.x86'', `alt.lang.asm'' 和`comp.os.linux.announce''

如果你想了解NASM beta版的發布,和當前的開發狀態,請通過在

      `http://groups.yahoo.com/group/nasm-devel'',      `http://www.pairlist.net/mailman/listinfo/nasm-devel'' and

      `http://sourceforge.net/projects/nasm''
     注冊來捐助''nasm-devel''郵件列表。
    在網站Sourceforge上的列表是較好的一個列表,它也是最新nasm源代碼與發布的一個網站,另外的列表也是公開的,但有可能不會被繼續長期支持。

  1.3 安裝
  1.3.1 在dos和Windows下安裝NASM
      如果你拿到了NASM的DOS安裝包,''nasmXXX.zip''(這里.''XXX''表示該安裝包的NASM版本號),把它解壓到它自己的目錄下(比如:‘c:\asm'')該包中會包含有四個可執行文件:NASM可擬行文件''nasm.exe''和''nasmw.exe'',還有NDISASM可執行文件''ndisasm.exe''和''ndisasmw.exe''。文件名以''w''結尾的是''Win32''可執行格式。是運行在''Windows 95''或''Windows NT''的Intel處理器上的,另外的是16位的''DOS''可執行文件。NASM運行時需要的唯一文件就是它自己的可執行文件,所以可以拷貝''nasm.exe''和''nasmw.exe''的其中一個到你自己的路徑下,或者可以編寫一個''autoexec.bat''把nasm的路徑加到你的''PATH''環境變量中去。(如果你只安裝了Win32版本的,你可能希望把文件名改成''nasm.exe''。)就這樣,NASM裝好了。你不需要為了運行nasm而讓''nasm''目錄一直存在(除非你把它加到了你的''PATH''中,所以如果你需要節省空間,你可刪掉它,但是,你可能需要保留文檔或測試程序。
   
    如果你下載了DOS版的源碼包,''nasmXXXs.zip'',那''nasm''目錄還會包含完整的NASM源代碼,你可以選擇一個Makefiles來重新構造你的NASM版本。注意源文件`insnsa.c'', `insnsd.c'', `insnsi.h''和`insnsn.c''是由''standard.mac''中的指令自動生成的,盡管NASM0.98發布版中包含了這些產生的文件,你如果改動了insns.dat,standard.mac或者文件,可能需要重新構造他們,在將來的源碼發布中有可能將不再包含這些文件,多平台兼容的Perl可以從www.cpan.org上得到。
  1.3.2 在unix下安裝NASM
      如果你得到了Unix下的NASM源碼包''nasm-x.xx.tar.gz''(這里x.xx表示該源碼包中的nasm的版本號),把它解壓壓到一個目錄,比如''/usr/local/src''。包被解壓后會創建自己的子目錄''nasm-x.xx''NASM是一個自動配置的安裝包:一旦你解壓了它,''cd''到它的目錄下,輸入''./configuer'',該腳本會找到最好的C編譯器來構造NASM,並據此建立Makefiles。一旦NASM被自動配置好后,你可以輸入''make''來構造''nasm''和''ndisasm''二進制文件,然后輸入''make install''把它們安裝到''/usr/local/bin'',並把man頁安裝到''/usr/local/man/man1''下的''nasm.1和''ndisasm.1''或者你可以給配置腳本一個''--prefix''選項來指定安裝目錄,或者也可以自己來安裝。
      NASM還附帶一套處理''RDOFF''目標文件格式的實用程序,它們在''rdoff''子目錄下,你可以用''make rdf''來構造它們,並使用''make rdf_install''來安裝。如果你需要的話。
      如果NASM在自動配置的時候失敗了,你還是可以使用文件''Makefile.unx''來編譯它們,把這個文件改名為''Makefile'',然后輸入''make''。在''rdoff''子目錄下同樣有一個Makefile.unx文件。
第二章 運行NASM
-----------------------
  
2.1 NASM命令行語法
要匯編一個文件,你可以以下面的格式執行一個命令:      nasm -f   [-o ]
比如,                                                                                       

      nasm -f elf myfile.asm         會把文件''myfile.asm''匯編成''ELF''格式 的文件''myfile.o''.還有:         

      nasm -f bin myfile.asm -o myfile.com        會把文件''myfile.asm''匯編成純二進制格式的文件''myfile.com''。

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

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

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

      它同時還會輸出可以使用的輸出文件格式,如果你使用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  -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 -i c:\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>'': 位移運算符。
      `>''提 供位右移。在NASM中,這樣的位移總是無符號的,所以位移后,左側總是以 零填充,並不會有符號擴展。
     
聲明:

     該教程摘自NASM的中文手冊,感謝翻譯作者的辛勤工作。

    來自網頁:http://blog.chinaunix.net/uid-7874697-id-2037994.html ,感謝提供者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM