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.
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 .
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 KommentarOperanderna ä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 .
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 utdataKompilatorn 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.
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.
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
assembleringsspråk | |
---|---|
ID | |
Översättare | |
Syntaxformat _ |