基本格式
nasm -f <format> <filename> [-o <output>]
比如:
nasm -f elf myfile.asm ; 將myfile.asm 編譯成 elf文件格式,的 myfile.o文件,elf 是linux的可執行程序格式
常用編譯命令
-f
指定要編譯的格式,
windows 用 -f win32 或者win64
linux用 -f elf
裸機用 -f bin
-o
指定編譯后的文件的名稱 否則會有默認的文件名稱
-i
%include指定要查找的目錄,最好是能在 NASMENV 環境變量里設置固定的路徑,省的每次設置
-d
宏定義,編譯的時候添加宏定義,這樣就可以在編譯的時候決定代碼的內容了
-l (小寫的L)
主要是查看匯編結果,調試之前對照用的,看哪里那個地址是不是寫錯了什么的
-e
這個也是調試的時候用的,主要是查看宏展開的等是否正確
舉例
nasm myfile.asm -d debug -I c:\nasmlib -f bin -o myfile.bin -l myfile.list
編譯 myfile.asm 文件
定義 debug 宏定義,如果文件中有條件宏 就可以根據我這里定義的debug 宏來是更多調試用的指令有效了
添加搜索文件的路徑為 c:\nasmlib 這樣如果我的文件中有%include 那么他就知道去哪里搜索對應的文件了
定義要變的格式是 bin格式
輸出文件的名稱叫 myfile.bin
同時產生列表文件交 myfile.list
NASMENV 環境變量
NASMENV 會附加在每個編譯之后,但是環境變量會被空格分開,所以nasm有個特性就是環境變量的第一個字符當做空格(不能是減號)
比如
'!-s!-ic:\nasmlib 第一個字符是! 所以這里會把當成是空格,而真正的空格就當成一個普通的字符,所以這個就等效於-s -ic:\nasmlib
NASM -h 簡單解釋
-f
參數指定 編譯的結果的格式
bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
elfx32 ELFX32 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
win64 Microsoft Win64 (x86-64) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
dbg Trace of all info passed to output stage
elf ELF (short name for ELF32)
macho MACHO (short name for MACHO32)
win WIN (short name for WIN32)
-l
(小寫的L) 參數 可以生成 匯編而二進制文件的對照
格式 nasm -f bin myfile.asm -l myfile.list
使用 nasm -h 參看說明
-o
指定輸出的文件名稱
nasm -f elf myfile.asm -o self.o
-i
指定搜索路徑,主要是用在%include 偽指令包含的文件的所搜路徑
-d/-D
添加預定義宏指令
就相當於在asm 文件前面自動添加一條 %define XXXX 指令
比如
nasm myfile.asm -dFOO=100
作為在文件中寫下面一行語句的一種替代實現:
%define FOO 100
-u/-U
與上一條相反就是取消一個宏定義
-e
僅預處理,包括對 宏的展開等,但是不能處理計算任務,所以 如果有 $-tablestart 會報錯
-p
預包含一個文件
就相當於在asm 文件前面自動添加一條 %include "filename" 偽指令
-M
產生對應的MAKEFILE文件
-F
使得輸出文件帶有調試信息
-g
使得調試信息有效
-E
將錯誤信息輸出到文件中
-s
把出錯信息輸出到stdout 中
-a
這是在和IDE集成的時候,取消掉自身的預處理的指令,一般直接用命令行的話是用不到的
-On
n是數字,指優化的次數,默認是兩遍
-t
TASM兼容模式,用不到
-w
開啟或者關閉某些警告
格式
-w+orphan-labels 開啟 orphan-labels 的警告
-w-orphan-labels 關閉 orphan-labels 的警告
可操作性的類型有
other any warning not specifially mentioned below (default on)
macro-params macro calls with wrong parameter count (default on)
macro-selfref cyclic macro references (default off)
macro-defaults macros with more default than optional parameters (default on)
orphan-labels labels alone on lines without trailing `:' (default on)
number-overflow numeric constant does not fit (default on)
gnu-elf-extensions using 8- or 16-bit relocation in ELF32, a GNU extension (default off)
float-overflow floating point overflow (default on)
float-denorm floating point denormal (default off)
float-underflow floating point underflow (default off)
float-toolong too many digits in floating-point number (default on)
user %warning directives (default on)
lock lock prefix on unlockable instructions (default on)
hle invalid hle prefixes (default on)
bnd invalid bnd prefixes (default on)
zext-reloc relocation zero-extended to match output format (default on)
ptr non-NASM keyword used in other assemblers (default on)
bad-pragma empty or malformed %pragma (default off)
unknown-pragma unknown %pragma facility or directive (default off)
not-my-pragma %pragma not applicable to this compilation (default off)
unknown-warning unknown warning in -W/-w or warning directive (default off)
all all possible warnings
-v
打印版本信息