Netwide Assembler

Netwide Assembler 的程式。 NASM 被認為是 Linux 平臺上最受歡迎的彙編工具之一。NASM 最初是在朱利安·霍爾的協助下由西蒙·泰瑟姆開發的。 截至2016年 (2016)[ [update]]，它被一個由 H.Peter Anvin 領導的小團隊所維護。 它是一款基於簡化版BSD許可證的開放原始碼軟體。功能.NASM 可以輸出包括 COFF、OMF、a.out、可執行與可連結格式等多種二進位制格式，而地址無關程式碼僅支援 ELF 物件檔案。 NASM 也有自己的二進位格式，稱為 RDOFF。輸出格式的廣泛性允許將程式重定向到任何 x86 作業系統在非 x86 平臺上執行，儘管它不能生成這些機器可用的程式。NASM 使用英特爾-{zh-cn:彙編;zh-tw:組合語言}-語法的變體而不是 AT&amp;T 語法等功能。用於各種作業系統的示例程式.這是一個 DOS 作業系統下的 "Hello world!" 程式：section .textorg 0x100mov ah, 0x9mov dx, helloint 0x21mov ax, 0x4c00int 0x21section .datahello: db 'Hello, world!', 13, 10, '$'一個類似程式在 Microsoft Windows 下的示例：global _mainextern _MessageBoxA@16extern _ExitProcess@4section code use32 class=code_main:push dword 0 ; UINT uType = MB_OKpush dword title ; LPCSTR lpCaptionpush dword banner ; LPCSTR lpTextpush dword 0 ; HWND hWnd = NULLcall _MessageBoxA@16push dword 0 ; UINT uExitCodecall _ExitProcess@4section data use32 class=databanner: db 'Hello, world!', 0title: db 'Hello', 0一段 Linux 下的等價程式：global _startsection .text_start:mov eax, 4 ; writemov ebx, 1 ; stdoutmov ecx, msgmov edx, msg.lenint 0x80 ; write(stdout, msg, strlen(msg));mov eax, 1 ; exitmov ebx, 0int 0x80 ; exit(0)section .datamsg: db "Hello, world!", 10.len: equ $ - msg下面是一個用於蘋果 macOS的 64 位元程式，用於輸入按鍵並將其顯示在螢幕上：global _startsection .dataquery_string: db "Enter a character: "query_string_len: equ $ - query_stringout_string: db "You have input: "out_string_len: equ $ - out_stringsection .bssin_char: resw 4section .text_start:mov rax, 0x2000004 ; put the write-system-call-code into register raxmov rdi, 1 ; tell kernel to use stdoutmov rsi, query_string ; rsi is where the kernel expects to find the address of the messagemov rdx, query_string_len ; and rdx is where the kernel expects to find the length of the messagesyscall; read in the charactermov rax, 0x2000003 ; read system callmov rdi, 0 ; stdinmov rsi, in_char ; address for storage, declared in section .bssmov rdx, 2 ; get 2 bytes from the kernel's buffer (one for the carriage return)syscall; show user the outputmov rax, 0x2000004 ; write system callmov rdi, 1 ; stdoutmov rsi, out_stringmov rdx, out_string_lensyscallmov rax, 0x2000004 ; write system callmov rdi, 1 ; stdoutmov rsi, in_charmov rdx, 2 ; the second byte is to apply the carriage return expected in the stringsyscall; exit system callmov rax, 0x2000001 ; exit system callxor rdi, rdisyscall連結.NASM 主要輸出目標檔案 ，它們在現代使用中固有地受到限制。 要將目標檔案轉換為可執行程式，必須使用適當的連結程式，例如用於 Windows 的 Visual Studio“LINK”實用程式或用於類 Unix 系統的 ld。發展.第一版釋出於1996年10月。2007年11月28日，2.00版本釋出，增加對 x86-64 擴充套件的支援。 開發版本不再上傳到 SourceForge.net；相反，它們會被檢入到專案自己的 Git 儲存庫中，而其二進位制程式的快照可在專案官網上找到。一個用於 NASM 文件的搜尋引擎也已可用。截至 2.07 版本，NASM 在簡化 BSD 許可證下發布。RDOFF.開發人員使用可重定位的動態物件檔案格式來測試 NASM 的目標檔案輸出能力的完整性。它很大程度上基於 NASM 的內部結構，主要由一個頭部組成，頭部包含輸出驅動程式函式呼叫的序列化，後跟包含可執行程式碼或資料的部分陣列。 NASM 發行版中包含了使用該格式的工具，包括連結程式 (linker) 和載入程式 (loader)。直到1996年10月釋出 0.90 版，NASM 才支援只輸出浮動格式的可執行檔案。在版本 0.90 中，Simon Tatham 增加了對一個目標檔案輸出介面的支援，並且只支援用於 16 位元程式碼的 DOS 的 .OBJ 檔案。NASM 因此缺少一個 32 位元的-{zh-cn:物件;zh-tw:目的檔}-格式。 為了解決這個問題，作為學習物件檔案介面的練習，開發人員朱利安·霍爾將第一版 RDOFF 釋出於 NASM 0.91 版本。自從這個初始版本以來，對 RDOFF 格式進行了一次重大更新，它在每個標題記錄上增加了一個記錄長度指示器， 允許程式跳過它們無法識別格式的記錄，並支援多個區段；RDOFF1 僅支援三個區段：-{zh-cn:文字;zh-tw:text}-，-{zh-cn:資料;zh-tw:data}-和 bss。Freshmeat1intel2gas