NASM

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. október 9-én felülvizsgált verziótól ; az ellenőrzések 27 szerkesztést igényelnek .
NASM
Típusú fordítóprogram
Szerző Simon Tatham, Julian Hall
Fejlesztők H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler
Beírva C [1]
Operációs rendszer Linux , Mac OS , Windows , DOS , KolibriOS
Első kiadás 1996
Hardver platform x86, x86_64
legújabb verzió 2.15.05 (2020. augusztus 28.)
Engedély LGPL , a 2.07-es verzió óta - egyszerűsített BSD licenc
Weboldal nasm.us

A NASM ( Netwide Assembler ) egy ingyenes ( LGPL és BSD licenc ) összeszerelő az Intel x86 architektúrához . 16, 32 és 64 bites programok írására szolgál.

Történelem

A NASM-et Simon Tatham és Julian Hall hozta létre, és jelenleg a SourceForge.net egy kis fejlesztőcsapata fejleszti . Eredetileg saját licenc alatt adták ki, de ezt a licencet később GNU LGPL -re változtatták a licencválasztás okozta sok probléma után. A 2.07-es verziótól kezdve a licenc „egyszerűsített BSD-re” ( 2-clause BSD ) módosult .

A NASM futhat nem x86-os platformokon, például SPARC -on és PowerPC -n , de csak x86-hoz és x86-64-hez generál kódot [2] .

A NASM sikeresen felveszi a versenyt a gázösszeszerelő szabvánnyal Linuxon és sok más UNIX rendszeren . [3] [4] [5] A NASM-et jobb minőségűnek tartják, mint a gázt. [5] Ezen túlmenően az alapértelmezett [6] gas assembler AT&T szintaxist használ , amely nem Intel processzorokra irányul, míg a NASM a hagyományos Intel szintaxis egy változatát használja az x86 assemblerekhez ; Az Intel szintaxist minden DOS/Windows assembler használja, például MASM , TASM , fasm .

A nyelv szintaxisa

A NASM az Intel szintaxisát használja az utasítások írására. Egy NASM assembly nyelvű mondat (programsor) a következő elemekből állhat:

Címke Utasítás Operandusok Megjegyzés

Az operandusokat vessző választja el. A karakterlánc előtt és az utasítás után tetszőleges számú szóköz karaktert használhat. A megjegyzés pontosvesszővel kezdődik, és a megjegyzés vége a sor vége. Utasításként egy parancs vagy pszeudo-parancs (fordító direktíva) használható. Ha a sor nagyon hosszú, akkor egy fordított perjellel áthelyezhető a következőre \, hasonlóan a C nyelvhez .

Fordítás és linkelés

A NASM különféle operációs rendszerekhez fordít programokat x86-kompatibilis processzorokon belül. Az egyik operációs rendszerben szabadon lefordíthat futtatható fájlt egy másikhoz.

A programok NASM-ben történő fordítása két lépésből áll. Az első az összeszerelés , a második az összekapcsolás . Az összeállítási szakaszban létrejön az objektumkód. Tartalmazza a program gépi kódját és az adatokat, a forráskódnak megfelelően , de az azonosítók (változók, szimbólumok) még nincsenek memóriacímekhez kötve. A link szakaszban egy végrehajtható fájl (program) jön létre egy vagy több objektummodulból . A link művelet a főprogramban meghatározott azonosítókat társítja más modulokban definiált azonosítókkal, ami után minden azonosító végleges memóriacímet kap, vagy dinamikusan allokál.

Objektumfájlok futtatható fájlokba való összekapcsolásához Windows rendszeren használhatja az ingyenes alink linkert [4] (64 bites programok esetén a GoLink linker), Linuxon pedig az ld linkert, amely az operációs rendszer bármely verziójában elérhető.

A fájl összeállításához írja be a következő parancsot:

nasm -f formátumú fájlnév -o kimenet

Ugrási utasítások

A fordító több lépésben dolgozza fel a programszöveget, így az ugrási utasítások a megfelelő címkék deklarálása előtt helyezhetők el.

A feltételes és feltétel nélküli ( jmp) ugrások parancsaiban alapértelmezés szerint a közeli típusú ugrások használatosak — near. Ezért, ha lehetséges egy rövid ugrás, hogy ne becsüljük túl a program méretét egy extra bájttal, meg kell adni az ugrás típusát short. A 0.98.09b verziótól kezdve az -Ox optimalizálási opciók kerültek hozzáadásra , amelyek lehetővé teszik az elágazási utasítások méretének automatikus optimalizálását [7] , a korábbi verziókban vagy ilyen opciók nélkül a minimális programméretet csak a program kézi módosításával lehet elérni. forráskód.

Kimeneti fájl formátum

A NASM számos kimeneti fájlformátumot támogat, köztük [8] :

A kimeneti fájl formátumát az -f parancssori kapcsolóval lehet megadni . A formátumok kiterjeszthetik egyes utasítások szintaxisát, és hozzáadhatják saját utasításaikat.

Példák a Hello, world! » különböző operációs rendszerekhez

Programpéldák Hello, world! , amely megjeleníti a megfelelő üzenetet és kilép.

Linux operációs rendszerhez SECTION .data msg db " Hello , world ! " , 0xa len equ $ - msg SECTION .text global _start ; a program belépési pontja _start: mov eax , 4 ; 'írás' syscall mov ebx , 1 ; fájl leírása. 1 (stdout) mov ecx , msg ; adatmutató mov edx , len ; adatmennyiség int 0x80 ; a kernel hívása mov eax , 1 ; '_exit' syscall mov ebx , 0 ; nulla kilépési kód (siker) int 0x80 ; hívja meg a rendszermagot Linux operációs rendszerhez (x64) global_start _ szakasz .text _start: mov rax , 1 ; az 1. rendszerhívás: mov rdi , 1 ; az 1. fájlkezelő stdout mov rsi , üzenet ; mov rdx , 13 kimenethez tartozó karakterlánc címe ; bájtok száma syscall ; hívja meg az operációs rendszert az íráshoz mov eax , 60 ; A 60-as rendszerhívás az xor rdi , rdi kilépés ; kilépési kód 0 syscall ; az operációs rendszer meghívása a kilépéshez : db " Hello , World " , 10 ; jegyezze meg az új sort a végén DOS operációs rendszer alatt SECTION .text org 0x100 ; erre az utasításra csak olyan .com fájl esetén van szükség, amely nem tartalmaz szakaszokat mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECTION .data hello DB " Helló világ ! " , 0xd , 0xa , ' $ ' Windows operációs rendszerhez (obj) % include ' WIN32N.INC ' EXTERN MessageBoxA Import MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll SZEKCIÓKÓD USE32 CLASS = KÓD ..start : push UINT MB_OK push UNT MB_OK push UNTSTRAT title push LPCTSTR title push LPCTSTR banner NULLLA push LPCTWSTR banner call [ ExitProcess ] SECTION DATA USE32 CLASS = DATA banner db ' Hello , world ! ' , 0xD , 0xA , 0 cím db ' Hello ' , 0 Windows x64 operációs rendszerhez (obj) ; Hello.asm EXTERN MessageBoxW EXTERN ExitProcess SECTION .text USE64 start: sub rsp , 28 h ; 32 bájt a Microsoft x64 hívási konvencióhoz "árnyéktér" + 8 bájt a veremhez igazításhoz a 16 bájtos határhoz a veremre helyezés után 8 bájt visszatérési cím xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ cím ] ; LPCTSTR lpCaption = cím xor r9 , r9 ; UINT uType = MB_OK MessageBoxW hívása ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 ExitProcess hívás ; ExitProcess(uExitCode) SECTION .data banner dw __utf16__ ( ' Hello , world ! ' ), 0 cím dw __utf16__ ( ' Hello ! ' ), 0

>nasm -f win64 Hello.asm
>golink Hello.obj kernel32.dll user32.dll

FreeBSD operációs rendszerhez SECTION .data msg db " Hello , world ! " , 0xa len equ $ - msg SECTION .text global _start ; a program belépési pontja _start: push dword len push dword msg push dword 1 ; 1 az stdout mov eax fájlleírója , 4 ; 4 a 'írási' syscall push eax ; egy extra dword-ot kell hagynunk a veremben int 0x80 ; a kernel hívása add esp , 16 ; a verem megtisztítása push dword 0 ; 0 a kilépési kód (siker) mov eax , 1 ; 1 a '_exit' syscall push eax ; extra dword a veremben int 0x80 ; a kernel hívása ; nincs takarítás - soha nem térünk vissza KolibriOS operációs rendszer alatt [9] A bitek 32 %-a tartalmazza a ' mos.inc ' szakaszt .text MOS_HEADER01 main , image_end , memory_end , stacktop , 0 , 0 main: redraw: call draw_window wait_event: MOS_WAITEVENT dec eax jz redraw dec eax jz gomb ; csak egy gombunk van, zárja be a MOS_EXIT billentyűt: ;billentyű lenyomva, olvassa el és hagyja figyelmen kívül a mov eax , MOS_SC_GETKEY int 0x40 jmp wait_event draw_window : MOS_STARTREDRAW xor eax , eax mov ebx , 10 * 61506 , 10 * 61506 , 50v40 Hello _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Világ ! ' , 0 image_end: section .bss alignb 4 stack resb 1024 stacktop: memory_end:

NASM-ben írt figyelemre méltó programok

  • Az Asmutils  rendszer segédprogramok készlete BSD, UnixWare, Solaris és AtheOS operációs rendszerekhez .
  • Az AsmOS projekt [10]  egy operációs rendszer a NASM assemblerben (jelenleg fejlesztés alatt áll).

Jegyzetek

  1. A nasm nyílt forráskódú projekt az Open Hubon: Nyelvek oldala – 2006.
  2. 1.1 Mi az a NASM? (nem elérhető link) . A Netwide Assembler: NASM . Hivatalos oldal. - "NASM, egy 80x86 és x86-64 assembler". Letöltve: 2010. július 14. Az eredetiből archiválva : 2012. február 18.. 
  3. Assemblers for Linux: A GAS és a NASM összehasonlítása . Letöltve: 2010. július 14. Az eredetiből archiválva : 2011. augusztus 16..
  4. 1 2 A NASM Assembly használata Windows rendszeren (lefelé irányuló kapcsolat) . Hozzáférés dátuma: 2010. július 17. Az eredetiből archiválva : 2009. július 20. 
  5. 1 2 Randall Hyde. Melyik Assembler a legjobb?  (angol)  (elérhetetlen link) . Hozzáférés dátuma: 2010. július 18. Az eredetiből archiválva : 2012. február 18.
  6. A gáz-2.10-ben megjelent speciális direktíván keresztül meghívott Intel szintaxis támogatása ; .intel_syntaxlásd gáz/NEWS  (eng.)  (downlink) . Hozzáférés dátuma: 2010. július 18. Az eredetiből archiválva : 2012. február 18.
  7. C.2.33 0.98.09b verzió, John Coffman javításokkal, 2001. október 28-án megjelent (lefelé irányuló kapcsolat) . A Netwide Assembler: NASM. C. függelék: NASM verzióelőzmények . Hivatalos oldal. Hozzáférés dátuma: 2010. július 18. Az eredetiből archiválva : 2012. február 18. 
  8. 7. fejezet: Kimeneti formátumok (lefelé irányuló kapcsolat) . A Netwide Assembler: NASM . Hivatalos oldal. Letöltve: 2010. július 14. Az eredetiből archiválva : 2012. február 18.. 
  9. Különféle fordítók használata a Hummingbirdsben . Letöltve: 2022. február 10. Az eredetiből archiválva : 2022. február 10.
  10. Operációs rendszer a NASM assemblerben . Letöltve: 2010. július 5. Az eredetiből archiválva : 2011. október 20..

Irodalom

  • Rudolf Marek. Összeszerelő példákkal. Alaptanfolyam. - Szentpétervár. : Tudomány és technika, 2005. - 240 p. — ISBN 5-94387-232-9 .
  • A. V. Sztoljarov. NASM Assembly Language Programming for Unix OS . - M. : MAKS Press, 2011. - 188 p. - ISBN 978-5-317-03627-0 .

Linkek