NASM | |
---|---|
Tip de | compilator |
Autor | Simon Tatham, Julian Hall |
Dezvoltatori | H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler |
Scris in | C [1] |
Sistem de operare | Linux , Mac OS , Windows , DOS , KolibriOS |
Prima editie | 1996 |
Platformă hardware | x86, x86_64 |
ultima versiune | 2.15.05 (28 august 2020) |
Licență | LGPL , începând cu versiunea 2.07 - licență BSD simplificată |
Site-ul web | nasm.us |
NASM ( Netwide Assembler ) este un asamblator gratuit ( LGPL și BSD ) pentru arhitectura Intel x86 . Folosit pentru a scrie programe pe 16, 32 și 64 de biți.
NASM a fost creat de Simon Tatham împreună cu Julian Hall și este în prezent dezvoltat de o echipă mică de dezvoltare la SourceForge.net . A fost lansat inițial sub propria licență, dar această licență a fost ulterior schimbată în GNU LGPL după o mulțime de probleme cauzate de alegerea licenței. Începând cu versiunea 2.07, licența a fost schimbată într-un „BSD simplificat” (BSD cu 2 clauze ).
NASM poate rula pe platforme non-x86, cum ar fi SPARC și PowerPC , dar generează doar cod pentru x86 și x86-64 [2] .
NASM concurează cu succes cu standardul de asamblare de gaz pe Linux și multe alte sisteme UNIX . [3] [4] [5] NASM este considerat a fi de o calitate mai bună decât gazul. [5] În plus, asamblatorul de gaz implicit [6] folosește sintaxa AT&T , care este orientată către procesoare non-Intel, în timp ce NASM utilizează o variantă a sintaxei tradiționale Intel pentru asamblatoarele x86 ; Sintaxa Intel este folosită de toți asamblatorii DOS/Windows, de exemplu MASM , TASM , fasm .
NASM folosește sintaxa Intel pentru scrierea instrucțiunilor. O propoziție în limbaj de asamblare NASM (linie de program) poate consta din următoarele elemente:
Etichetare Instrucțiuni Operanzi ComentariuOperanzii sunt separați prin virgulă. Puteți utiliza orice număr de caractere de spațiu înainte de șir și după instrucțiune. Un comentariu începe cu punct și virgulă, iar sfârșitul comentariului este sfârșitul rândului. O comandă sau pseudo-comandă (directiva compilatorului) poate fi folosită ca instrucțiune. Dacă linia este foarte lungă, atunci poate fi mutată la următoarea folosind o bară oblică inversă \, similar cu modul în care se face în limbajul C.
NASM compilează programe pentru diferite sisteme de operare în cadrul procesoarelor compatibile cu x86. Fiind într-un sistem de operare, puteți compila liber un fișier executabil pentru altul.
Compilarea programelor în NASM constă în doi pași. Primul este asamblarea , al doilea este legarea . În etapa de asamblare, este creat codul obiect. Conține codul mașină al programului și date, în conformitate cu codul sursă , dar identificatorii (variabile, simboluri) nu sunt încă legați de adresele de memorie. În etapa de legătură , un fișier executabil (program) este creat din unul sau mai multe module obiect . Operația de legătură asociază identificatori definiți în programul principal cu identificatori definiți în alte module, după care tuturor identificatorilor li se dau adrese finale de memorie sau sunt alocați dinamic.
Pentru a lega fișierele obiect în executabile pe Windows, puteți utiliza linkerul gratuit alink [4] (pentru programe pe 64 de biți, linkerul GoLink) și pe Linux, linkerul ld, care este disponibil în orice versiune a acestui sistem de operare.
Pentru a asambla fișierul, introduceți următoarea comandă:
nasm -f format nume de fișier -o ieșireCompilatorul procesează textul programului în mai multe treceri, astfel încât instrucțiunile de salt să poată fi plasate înainte ca etichetele corespunzătoare să fie declarate.
În comenzile de sărituri condiționate și necondiționate ( jmp), tipul de sărituri aproape este utilizat în mod implicit — near. Prin urmare, dacă este posibil un salt scurt, pentru a nu supraestima dimensiunea programului cu un octet suplimentar, este necesar să specificați în mod specific tipul de salt short. Din versiunea 0.98.09b au fost adăugate opțiunile de optimizare -Ox , care vă permit să optimizați automat dimensiunea instrucțiunilor de ramificație [7] , în versiunile anterioare sau fără astfel de opțiuni, dimensiunea minimă a programului poate fi obținută doar prin modificarea manuală a cod sursa.
NASM acceptă multe formate de fișiere de ieșire, printre care [8] :
Formatul fișierului de ieșire poate fi specificat utilizând comutatorul -f din linia de comandă . Formatele pot extinde sintaxa unor instrucțiuni și pot adăuga propriile instrucțiuni.
Exemple de programe Bună, lume! , care afișează mesajul corespunzător și iese.
Pentru sistemul de operare Linux SECTION .data msg db " Salut , lume ! " , 0xa len equ $ - msg SECTION .text global _start ; punctul de intrare în program _start: mov eax , 4 ; 'scrie' syscall mov ebx , 1 ; fisier descr. 1 (stdout) mov ecx , msg ; pointer la date mov edx , len ; cantitatea de date int 0x80 ; apel la kernel mov eax , 1 ; '_exit' syscall mov ebx , 0 ; cod de ieșire zero (succes) int 0x80 ; apel la nucleu Pentru sistemul de operare Linux (x64) global_start _ sectiunea .text _start: mov rax , 1 ; apelul de sistem 1 este write mov rdi , 1 ; mânerul fișierului 1 este stdout mov rsi , mesaj ; adresa șirului la ieșire mov rdx , 13 ; numărul de octeți syscall ; invoca sistemul de operare pentru a face scrierea mov eax , 60 ; apelul de sistem 60 este exit xor rdi , rdi ; cod de ieșire 0 syscall ; invocați sistemul de operare pentru a ieși din mesajul: db „ Bună ziua , lume ” , 10 ; notați noua linie la sfârșit Sub sistemul de operare DOS SECȚIUNEA .text org 0x100 ; această directivă este necesară doar în cazul unui fișier .com care nu are secțiuni mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECȚIUNEA .data salut DB " Salut , lume ! " , 0xd , 0xa , ' $ ' Pentru sistemul de operare Windows (obj) % includ ' WIN32N.INC ' EXTERN MessageBoxA Import MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll SECȚIUNE COD USE32 CLASS = COD ..start : push UINT MB_OK push LPCTSTR titlu push LPCTSTR banner push HWNDx NULL apel ] [ Mesaj pushBox NULL apel ] sunați la [ ExitProcess ] SECȚIUNEA DATE USE32 CLASS = DATE banner db ' Bună ziua , lume ! ' , 0xD , 0xA , 0 titlu db ' Bună ziua ' , 0 Pentru sistemul de operare Windows x64 (obj) ; Hello.asm EXTERN MessageBoxW EXTERN ExitProcess SECTION .text USE64 start: sub rsp , 28 h ; 32 de octeți pentru convenția de apelare Microsoft x64 „spațiu umbră” + 8 octeți pentru alinierea stivei la limita de 16 octeți după apel pus pe stiva 8 octeți adresa de retur xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ titlu ] ; LPCTSTR lpCaption = titlu xor r9 , r9 ; UINT uType = MB_OK apel MessageBoxW ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 apel ExitProcess ; ExitProcess(uExitCode) SECȚIUNEA .data banner dw __utf16__ ( ' Bună ziua , lume ! ' ), 0 titlu dw __utf16__ ( ' Bună ziua ! ' ), 0>nasm -f win64 Hello.asm
>golink Hello.obj kernel32.dll user32.dll
limbaj de asamblare | |
---|---|
IDE | |
Traducători | |
Formate de sintaxă |