Netwide Assembler - Netwide Assembler
| Orijinal yazar (lar) | Simon Tatham , Julian Hall |
|---|---|
| Geliştirici (ler) | H. Peter Anvin , vd. |
| İlk sürüm | Ekim 1996 |
| Kararlı sürüm | 2.15.05 / 28 Ağustos 2020
|
| Depo |
|
| Yazılmış | Montaj , C |
| İşletim sistemi | Unix benzeri , Windows , OS / 2 , MS-DOS |
| Uygun | İngilizce |
| Tür | x86 montajcısı |
| Lisans | BSD 2 maddeli |
| İnternet sitesi | www |
Netwide Assembler ( NASM ) bir olan montajcı ve disassembler'a için Intel x86 mimarisi. Yazmak için kullanılabilir 16 bit , 32-bit ( IA-32 ) ve 64 bit ( x86-64 ) programları. NASM, Linux için en popüler derleyicilerden biri olarak kabul edilir .
NASM aslen Julian Hall'un yardımıyla Simon Tatham tarafından yazılmıştır . 2016 itibariyle, H. Peter Anvin liderliğindeki küçük bir ekip tarafından sürdürülmektedir . Öyle açık kaynak yazılım basitleştirilmiş (2-maddesi) şartları altında piyasaya BSD lisansı .
Özellikleri
NASM, konumdan bağımsız kod olsa da COFF , OMF, a.out , Yürütülebilir ve Bağlanabilir Biçim (ELF), Mach-O ve ikili dosya (.bin, ikili disk görüntüsü, işletim sistemlerini derlemek için kullanılır ) dahil olmak üzere çeşitli ikili biçimler üretebilir yalnızca ELF nesne dosyaları için desteklenir . NASM'nin ayrıca RDOFF adlı kendi ikili formatı vardır.
Çeşitli çıktı biçimleri, programların hemen hemen her x86 işletim sistemine (OS) yeniden hedeflenmesine olanak tanır . Ayrıca NASM, önyükleme yükleyicileri , salt okunur bellek (ROM) görüntüleri ve işletim sistemi geliştirmenin çeşitli yönlerinde yazmak için kullanılabilen düz ikili dosyalar oluşturabilir . NASM, PowerPC ve SPARC gibi x86 olmayan platformlarda çapraz derleyici olarak çalışabilir, ancak bu makineler tarafından kullanılabilen programlar oluşturamaz.
NASM , AT&T sözdizimi yerine bir çeşit Intel derleme sözdizimi kullanır . Ayrıca , MASM ve uyumlu derleyiciler tarafından kullanılan otomatik segment geçersiz kılmaları (ve ilgili ASSUME yönergesi) gibi özelliklerden de kaçınır .
Çeşitli işletim sistemleri için birleştirilmiş program örnekleri
Bu bir "Merhaba dünya!" DOS işletim sistemi için program .
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, '$'
Linux için eşdeğer bir program :
global _start
section .text
_start:
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, msg
mov edx, msg.len
int 0x80 ; write(stdout, msg, strlen(msg));
xor eax, msg.len ; invert return value from write()
xchg eax, ebx ; value for exit()
mov eax, 1 ; exit
int 0x80 ; exit(...)
section .data
msg: db "Hello, world!", 10
.len: equ $ - msg
Microsoft Windows için benzer bir program örneği :
global _main
extern _MessageBoxA@16
extern _ExitProcess@4
section code use32 class=code
_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 _MessageBoxA@16
push dword 0 ; UINT uExitCode
call _ExitProcess@4
section data use32 class=data
banner: db 'Hello, world!', 0
title: db 'Hello', 0
Aşağıda, bir tuş vuruşunu girip ekranda gösteren Apple OS X için 64 bit bir program bulunmaktadır.
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 write-system-call-code 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 kernel's 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
Bağlanıyor
NASM , genellikle kendi başlarına çalıştırılamayan nesne dosyalarını çıkarır . Bunun tek istisnası , modern kullanımda doğası gereği sınırlı olan düz ikili dosyalardır (örn., .COM ). Nesne dosyalarını çalıştırılabilir programlara çevirmek için, Windows için Visual Studio "LINK" yardımcı programı veya Unix benzeri sistemler için ld gibi uygun bir bağlayıcı kullanılmalıdır .
Geliştirme
İlk sürüm olan 0.90 sürümü Ekim 1996'da piyasaya sürüldü.
28 Kasım 2007'de, 2.00 sürümü piyasaya sürüldü ve x86-64 uzantıları için destek eklendi . Geliştirme sürümleri SourceForge.net'e yüklenmez ; bunun yerine proje web sayfasından kullanılabilen ikili anlık görüntülerle GitHub'a kontrol edilirler .
NASM belgeleri için bir arama motoru da mevcuttur.
Temmuz 2009'da, 2.07 sürümünden itibaren NASM, Basitleştirilmiş (2 maddeli) BSD lisansı altında piyasaya sürüldü. Daha önce, NASM LGPL altında lisanslandığı için, NASM'nin Yeni BSD Lisansı altında tamamen yeniden yazılması olan Yasm'ın geliştirilmesine yol açtı . Yasm, NASM'den önce x86-64 için destek sundu. Ayrıca GNU Assembler sözdizimi için destek ekledi .
RDOFF
| Tarafından geliştirilmiş | Julian Hall |
|---|---|
| Biçim türü | Nesne dosya biçimi |
| İçin konteyner | Nesne kodu |
Yeniden Konumlandırılabilir Dinamik Nesne Dosyası Biçimi (RDOFF), geliştiriciler tarafından NASM'nin nesne dosyası çıktı yeteneklerinin bütünlüğünü test etmek için kullanılır. Esas olarak , çıkış sürücüsü işlev çağrılarının bir serileştirmesini ve ardından yürütülebilir kod veya verileri içeren bir bölüm dizisini içeren bir başlıktan oluşan NASM'nin dahili yapısına dayanır . Bir bağlayıcı ve yükleyici dahil formatı kullanmak için araçlar, NASM dağıtımına dahildir.
0.90 sürümü Ekim 1996'da piyasaya sürülene kadar, NASM yalnızca düz formatlı çalıştırılabilir dosyaların (örn. DOS COM dosyaları ) çıktılarını destekledi . 0.90 sürümünde, Simon Tatham bir nesne dosyası çıktı arabirimi ve yalnızca 16 bit kod için DOS .OBJ dosyaları için destek ekledi.
Bu nedenle NASM, 32 bitlik bir nesne formatından yoksundu. Bu eksikliği gidermek ve nesne-dosya arayüzünü öğrenmek için bir alıştırma olarak geliştirici Julian Hall, NASM 0.91 sürümünde yayınlanan RDOFF'un ilk sürümünü bir araya getirdi.
Bu ilk sürümden bu yana, RDOFF biçiminde bir büyük güncelleme yapıldı; bu, her başlık kaydına bir kayıt uzunluğu göstergesi ekleyerek programların biçimini tanımadıkları kayıtları atlamasına olanak tanıdı ve birden çok segmenti destekledi; RDOFF1 yalnızca üç segmenti destekler: metin , veri ve bss (başlatılmamış veriler içerir).
Ayrıca bakınız
Referanslar
daha fazla okuma
- Jeff Duntemann (2000). Adım Adım Assembly Dili . J Wiley and Sons. ISBN 0-471-37523-3 .
Dış bağlantılar
- Resmi internet sitesi
- Netwide Assembler üzerinde SourceForge.net
- Win32 ve BeOS için özel sürüm.
- GAS ve NASM'ın karşılaştırılması ile IBM
- "Netwide Assembler" . Freecode . : Montajcılar NASM'ın ve kaynak biçimi arasında bir dönüştürücü GAZ