Netwide Assembler （簡稱 NASM）是一款基於英特爾 x86 架構的彙編與反彙編工具。它可以用來編寫 16 位、32 位（IA32）和 64 位（x8664）的程式。 NASM 被認為是 Linux 平臺上最受歡迎的彙編工具之一。 NASM 最初是在朱利安霍爾的協助下由西蒙泰瑟姆開發的。 ，它被一個由 HPeter Anvin 領導的小團隊所維護。它是一款基於簡化版（二句版）BSD 許可證的開放原始碼軟體。 功能 NASM 可以輸出包括 COFF、OMF、aout、可執行與可連結格式（ELF）、MachO 和二進位制檔案（bin，二進位制磁碟映像，用於編譯作業系統）等多種二進位制格式，而地址無關程式碼僅支援 ELF 物件檔案。 NASM 也有自己的二進位格式，稱為 RDOFF。 輸出格式的廣泛性允許將程式重定向到任何 x86 作業系統（OS）。 此外，NASM 可以建立浮動二進位制檔案，它可用於寫入引導載入程式、只讀儲存器（ROM）映像以及作業系統開發的各個方面。 NASM 可以作為交叉彙編程式（如 PowerPC 和 SPARC）在非 x86 平臺上執行，儘管它不能生成這些機器可用的程式。 NASM 使用英特爾 zhcn 彙編；zhtw 組合語言 語法的變體而不是 ATT 語法（GNU 彙編器採用的語法）。 它還避免了 MASM 和相容彙編器使用的自動生成區段覆蓋（以及相關的 ASSUME 指令）等功能。 用於各種作業系統的示例程式 這是一個 DOS 作業系統下的 Hello world 程式： section text org 0x100 mov ah 0x9 mov dx hello int 0x21 mov ax 0x4c00 int 0x21 section data hello db Hello world 13 10 一個類似程式在 Microsoft Windows 下的示例： global _main extern _MessageBoxA16 extern _ExitProcess4 section code use32 classcode _main push dword 0 UINT uType MB_OK push dword title LPCSTR lpCaption push dword banner LPCSTR lpText push dword 0 HWND hWnd NULL call _MessageBoxA16 push dword 0 UINT uExitCode call _ExitProcess4 section data use32 classdata banner db Hello world 0 title db Hello 0 一段 Linux 下的等價程式： global _start section text _start mov eax 4 write mov ebx 1 stdout mov ecx msg mov edx msglen int 0x80 write stdout msg strlen msg mov eax 1 exit mov ebx 0 int 0x80 exit 0 section data msg db Hello world 10 len equ msg 下面是一個用於蘋果 macOS（原為 OS X）的 64 位元程式，用於輸入按鍵並將其顯示在螢幕上： global _start section data query_string db Enter a character query_string_len equ query_string out_string db You have input out_string_len equ out_string section bss in_char resw 4 section text _start mov rax 0x2000004 put the writesystemcallcode into register rax mov rdi 1 tell kernel to use stdout mov rsi query_string rsi is where the kernel expects to find the address of the message mov rdx query_string_len and rdx is where the kernel expects to find the length of the message syscall read in the character mov rax 0x2000003 read system call mov rdi 0 stdin mov rsi in_char address for storage declared in section bss mov rdx 2 get 2 bytes from the kernels buffer one for the carriage return syscall show user the output mov rax 0x2000004 write system call mov rdi 1 stdout mov rsi out_string mov rdx out_string_len syscall mov rax 0x2000004 write system call mov rdi 1 stdout mov rsi in_char mov rdx 2 the second byte is to apply the carriage return expected in the string syscall exit system call mov rax 0x2000001 exit system call xor rdi rdi syscall 連結 NASM 主要輸出目標檔案（副檔名一般為 obj），這些目標檔案通常不能自行執行。唯一的例外是浮動二進位制檔案（例如 COM） ，它們在現代使用中固有地受到限制。 要將目標檔案轉換為可執行程式，必須使用適當的連結程式，例如用於 Windows 的 Visual Studio LINK 實用程式或用於類 Unix 系統的 ld。 發展 第一版（版本號 090）釋出於 1996 年 10 月。 2007 年 11 月 28 日，200 版本釋出，增加對 x8664 擴充套件的支援。 開發版本不再上傳到 SourceForgenet；相反，它們會被檢入到專案自己的 Git 儲存庫中，而其二進位制程式的快照可在專案官網上找到。 一個用於 NASM 文件的搜尋引擎也已可用。 截至 207 版本，NASM 在簡化 BSD 許可證（二句版）下發布。 RDOFF 開發人員使用可重定位的動態物件檔案格式（RDOFF）來測試 NASM 的目標檔案輸出能力的完整性。它很大程度上基於 NASM 的內部結構，主要由一個頭部組成，頭部包含輸出驅動程式函式呼叫的序列化，後跟包含可執行程式碼或資料的部分陣列。 NASM 發行版中包含了使用該格式的工具，包括連結程式 linker 和載入程式 loader。 直到 1996 年 10 月釋出 090 版，NASM 才支援只輸出浮動格式的可執行檔案（例如 DOS 的 COM 檔案）。在版本 090 中，Simon Tatham 增加了對一個目標檔案輸出介面的支援，並且只支援用於 16 位元程式碼的 DOS 的 OBJ 檔案。 NASM 因此缺少一個 32 位元的 zhcn 物件；zhtw 目的檔 格式。 為了解決這個問題，作為學習物件檔案介面的練習，開發人員朱利安霍爾將第一版 RDOFF 釋出於 NASM 091 版本。 自從這個初始版本以來，對 RDOFF 格式進行了一次重大更新，它在每個標題記錄上增加了一個記錄長度指示器， 允許程式跳過它們無法識別格式的記錄，並支援多個區段；RDOFF1 僅支援三個區段：zhcn 文字；zhtwtext，zhcn 資料；zhtwdata 和 bss（包含未初始化的資料）。 另請參見 組合語言 彙編器列表 Yasm 參考文獻 擴充套件閱讀 外部連結 Special edition for Win32 and BeOS A comparison of GAS and NASM at IBM a converter between the source format of the assemblers NASM and GAS Freshmeat1intel2gas CategoryDOS 軟體 Category 反彙編器 Category 自由編譯器與直譯器 CategoryMacOS Category 使用 BSD 許可證的軟體