NASM

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 9 oktober 2021; kontroller kräver 27 redigeringar .
NASM
Sorts kompilator
Författare Simon Tatham, Julian Hall
Utvecklare H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler
Skrivet i C [1]
Operativ system Linux , Mac OS , Windows , DOS , KolibriOS
Första upplagan 1996
Hårdvaruplattform x86, x86_64
senaste versionen 2.15.05 (28 augusti 2020)
Licens LGPL , sedan version 2.07 - förenklad BSD-licens
Hemsida nasm.us

NASM ( Netwide Assembler ) är en gratis ( LGPL- och BSD-licens ) assembler för Intel x86 -arkitekturen . Används för att skriva 16-, 32- och 64-bitars program.

Historik

NASM skapades av Simon Tatham med Julian Hall och utvecklas för närvarande av ett litet utvecklingsteam på SourceForge.net . Den släpptes ursprungligen under sin egen licens, men denna licens ändrades senare till GNU LGPL efter många problem orsakade av valet av licens. Från och med version 2.07 har licensen ändrats till en "förenklad BSD" ( 2-klausul BSD ).

NASM kan köras på icke-x86-plattformar som SPARC och PowerPC , men den genererar bara kod för x86 och x86-64 [2] .

NASM konkurrerar framgångsrikt med gasmonteringsstandarden på Linux och många andra UNIX-system . [3] [4] [5] NASM anses vara av bättre kvalitet än gas. [5] Dessutom använder standardgassamlaren [6] AT&T-syntax , som är orienterad mot icke-Intel-processorer, medan NASM använder en variant av den traditionella Intel-syntaxen för x86-montörer ; Intel-syntax används av alla DOS/Windows-montörer, t.ex. MASM , TASM , fasm .

Syntax för språket

NASM använder Intel-syntaxen för att skriva instruktioner. En NASM-sammansättningsspråksats (programrad) kan bestå av följande element:

Etikett Instruktion Operander Kommentar

Operanderna är åtskilda av ett kommatecken. Du kan använda valfritt antal blanksteg före strängen och efter satsen. En kommentar börjar med semikolon och slutet av kommentaren är slutet på raden. Ett kommando eller pseudo-kommando (kompilatordirektiv) kan användas som en instruktion. Om raden är mycket lång kan den flyttas till nästa med ett snedstreck \, liknande hur det görs i C- språket .

Kompilera och länka

NASM sammanställer program för olika operativsystem inom x86-kompatibla processorer. Genom att vara i ett operativsystem kan du fritt kompilera en körbar fil för ett annat.

Att kompilera program i NASM består av två steg. Den första är montering , den andra är länkning . Vid monteringsstadiet skapas objektkod. Den innehåller programmets maskinkod och data, i enlighet med källkoden , men identifierare (variabler, symboler) är ännu inte bundna till minnesadresser. I länkstadiet skapas en körbar fil (program) från en eller flera objektmoduler . Länkoperationen associerar identifierare definierade i huvudprogrammet med identifierare definierade i andra moduler, varefter alla identifierare ges slutliga minnesadresser eller dynamiskt allokerade.

För att länka objektfiler till körbara filer på Windows kan du använda den kostnadsfria alink-linkern [4] (för 64-bitarsprogram, GoLink-linkern), och på Linux, ld-linkern, som är tillgänglig i alla versioner av detta operativsystem.

För att sätta ihop filen, skriv in följande kommando:

nasm -f format filnamn -o utdata

Hoppa instruktioner

Kompilatorn bearbetar programtexten i flera omgångar, så att hoppinstruktioner kan placeras innan motsvarande etiketter deklareras.

I kommandona för villkorliga och ovillkorliga ( jmp) hopp, används den närmaste typen av hopp som standard — near. Därför, om ett kort hopp är möjligt, för att inte överskatta programmets storlek med en extra byte, är det nödvändigt att specifikt ange hopptypen short. Sedan version 0.98.09b har -Ox-optimeringsalternativen lagts till , som gör att du automatiskt kan optimera storleken på greninstruktioner [7] , i tidigare versioner eller utan sådana alternativ kan den minsta programstorleken endast erhållas genom att manuellt modifiera källkod.

Utdatafilformat

NASM stöder många utdatafilformat, bland dem [8] :

Utdatafilformatet kan specificeras med kommandoradsomkopplaren -f . Format kan utöka syntaxen för vissa instruktioner och lägga till sina egna instruktioner.

Exempel på Hej världen! » för olika operativsystem

Programexempel Hej världen! , som visar lämpligt meddelande och avslutas.

För Linux operativsystem SECTION .data msg db " Hej världen ! " , 0xa len equ $ -msg SECTION .text global _start ; _ _ programmets startpunkt _start: mov eax , 4 ; 'skriv' syscall mov ebx , 1 ; fil beskrivning. 1 (stdout) mov ecx , msg ; pekare till data mov edx , len ; mängd data int 0x80 ; anrop till kärnan mov eax , 1 ; '_exit' syscall mov ebx , 0 ; noll utgångskod (framgång) int 0x80 ; anrop till kärnan För Linux operativsystem (x64) global_start _ avsnitt .text _start: mov rax , 1 ; systemanrop 1 är skriv mov rdi , 1 ; filhandtag 1 är stdout mov rsi , meddelande ; strängens adress till utdata mov rdx , 13 ; antal byte syscall ; anropa operativsystemet för att skriva mov eax , 60 ; systemanrop 60 är exit xor rdi , rdi ; utgångskod 0 syscall ; anropa operativsystem för att avsluta meddelande: db " Hello , World " , 10 ; notera nyraden i slutet Under DOS operativsystem SECTION .text org 0x100 ; detta direktiv behövs endast i fallet med en .com-fil som inte har några avsnitt mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECTION .data hej DB " Hej världen ! " , 0xd , 0xa , ' $ ' För Windows operativsystem (obj) % inkluderar ' WIN32N.INC ' EXTERN MessageBoxA Import MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll AVSNITTSKOD USE32 KLASS = KOD ..start : push UINT MB_OK push LPCTSTR titel push LPCTSTR banner push HWND NULL anrop [ _ _ _ _ _ ring [ ExitProcess ] SECTION DATA USE32 CLASS = DATA banner db ' Hej världen ! _ ' , 0xD , 0xA , 0 title db ' Hej ' , 0 För Windows x64 operativsystem (obj) ; Hello.asm EXTERN MessageBoxW EXTERN ExitProcess SECTION .text USE64 start : sub rsp , 28 h ; 32 byte för Microsoft x64 som anropar konventionen "skuggutrymme" + 8 byte för stackjustering till 16 byte gräns efter anrop lagt på stack 8 byte returadress xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ title ] ; LPCTSTR lpCaption = titel xor r9 , r9 ; UINT uType = MB_OK anrop MessageBoxW ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 anrop ExitProcess ; ExitProcess(uExitCode) SECTION .databanner dw __utf16__ ( ' Hej , världen ! ' ) , 0 title dw __utf16__ ( ' Hej ! ' ), 0

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

För operativsystemet FreeBSD SECTION .data msg db " Hej världen ! " , 0xa len equ $ -msg SECTION .text global _start ; _ _ programmets startpunkt _start: push dword len push dword msg push dword 1 ; 1 är filbeskrivningen för stdout mov eax , 4 ; 4 är "write" syscall push eax ; vi måste lämna ett extra dword på stacken int 0x80 ; anrop till kärnan lägg till esp , 16 ; rensa upp stacken push dword 0 ; 0 är utgångskoden (framgång) mov eax , 1 ; 1 är '_exit' syscall push eax ; extra dword på stacken int 0x80 ; anrop till kärnan ; ingen städning - vi kommer aldrig tillbaka Under operativsystemet KolibriOS [9] bitar 32 % inkluderar ' mos.inc' - sektionen .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 tangent ;knapp nedtryckt; vi har bara en knapp, stäng MOS_EXIT - tangenten: ;tangent nedtryckt, läs den och ignorera mov eax , MOS_SC_GETKEY int 0x40 jmp wait_event draw_window : MOS_STARTREDRAW xor eax , eax mov ebx , 10 * 65536 + 65536 + 05 mov * 05 mov * 05 mov edx , 0x33FFFFFF mov edi , header int 0x40 ; define & draw window mov eax , MOS_SC_WRITETEXT mov ebx , 30 * 65536 + 10 mov ecx , 0x80000000 mov 0x80000000 mov 000000000 mov string i helvete ' b string ' b reto ' string ; _ _ _ Världen ! ' , 0 image_end: avsnitt .bss alignb 4 stack resb 1024 stacktop: memory_end:

Anmärkningsvärda program skrivna i NASM

  • Asmutils  är en uppsättning systemverktyg för operativsystemen BSD, UnixWare, Solaris och AtheOS .
  • AsmOS -projektet [10]  är ett operativsystem i NASM assembler (för närvarande under utveckling).

Anteckningar

  1. Nasm Open Source Project på Open Hub: Languages-sidan - 2006.
  2. 1.1 Vad är NASM? (inte tillgänglig länk) . The Netwide Assembler: NASM . Officiell sida. - "NASM, är en 80x86 och x86-64 assembler". Hämtad 14 juli 2010. Arkiverad från originalet 18 februari 2012. 
  3. Assemblers för Linux: Jämföra GAS och NASM . Hämtad 14 juli 2010. Arkiverad från originalet 16 augusti 2011.
  4. 1 2 Använda NASM Assembly på Windows (nedlänk) . Tillträdesdatum: 17 juli 2010. Arkiverad från originalet 20 juli 2009. 
  5. 1 2 Randall Hyde. Vilken assembler är bäst?  (engelska)  (otillgänglig länk) . Tillträdesdatum: 18 juli 2010. Arkiverad från originalet 18 februari 2012.
  6. Stöd för Intel-syntaxen anropad genom specialdirektivet .intel_syntax, dök upp i gas-2.10; se gas/NEWS  (eng.)  (nedlänk) . Tillträdesdatum: 18 juli 2010. Arkiverad från originalet 18 februari 2012.
  7. C.2.33 Version 0.98.09b med John Coffman patchar släppt 28-okt-2001 (nedlänk) . The Netwide Assembler: NASM. Bilaga C: NASM-versionshistorik . Officiell sida. Tillträdesdatum: 18 juli 2010. Arkiverad från originalet 18 februari 2012. 
  8. Kapitel 7: Utdataformat (nedlänk) . The Netwide Assembler: NASM . Officiell sida. Hämtad 14 juli 2010. Arkiverad från originalet 18 februari 2012. 
  9. Användning av olika kompilatorer i Hummingbirds . Hämtad 10 februari 2022. Arkiverad från originalet 10 februari 2022.
  10. Operativsystem i NASM assembler . Hämtad 5 juli 2010. Arkiverad från originalet 20 oktober 2011.

Litteratur

  • Rudolf Marek. Montör med exempel. Grundkurs. - St Petersburg. : Vetenskap och teknik, 2005. - 240 sid. — ISBN 5-94387-232-9 .
  • A.V. Stolyarov. NASM Assembly Language Programmering för Unix OS . - M. : MAKS Press, 2011. - 188 sid. - ISBN 978-5-317-03627-0 .

Länkar