Netwide Assembler - Netwide Assembler

Netwide Assembler
NASM logosu
Orijinal yazar (lar) Simon Tatham , Julian Hall
Geliştirici (ler) H. Peter Anvin , vd.
İlk sürüm Ekim 1996 ; 24 yıl önce  ( 1996-10 )
Kararlı sürüm
2.15.05 / 28 Ağustos 2020 ; 6 ay önce  ( 2020-08-28 )
Depo Bunu Vikiveri'de düzenleyin
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 .nasm .us

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

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

Dış bağlantılar