NASM

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 9 octombrie 2021; verificările necesită 27 de modificări .
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.

Istorie

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 .

Sintaxa limbii

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 Comentariu

Operanzii 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.

Compilarea și legarea

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șire

Instrucțiuni de salt

Compilatorul 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.

Format fișier de ieșire

NASM acceptă multe formate de fișiere de ieșire, printre care [8] :

  • bin  este un fișier de format arbitrar, determinat doar de codul sursă . Potrivit atât pentru fișiere de date, cât și pentru module cu cod executabil, cum ar fi încărcătoare de pornire, imagini ROM , module de sistem de operare , drivere MS-DOS .SYS sau executabile .COM .
  • obj  este un modul obiect în format OMF compatibil cu MASM și TASM .
  • win32 și win64  este un modul obiect pentru cod pe 32 și 64 de biți, compatibil cu compilatoarele Microsoft Win32 și Win64 .
  • aout  este un modul obiect într-o variantă a formatului a.out utilizat pe primele sisteme Linux .
  • aoutb  este versiunea formatului a.out pentru sistemele de operare compatibile BSD .
  • coff  este un modul obiect în format COFF compatibil cu linkerul DJGPP .
  • elf32 și elf64  este un modul obiect în formatele ELF32 și ELF64 utilizate de Linux și Unix System V , inclusiv Solaris x86, UnixWare și SCO Unix .

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 Hello, world! » pentru diferite sisteme de operare

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

Pentru sistemul de operare FreeBSD SECTION .data msg db " Salut , lume ! " , 0xa len equ $ - msg SECTION .text global _start ; punctul de intrare în program _start: push dword len push dword msg push dword 1 ; 1 este descriptorul de fișier al stdout mov eax , 4 ; 4 este sistemul push eax de „scriere” ; trebuie să lăsăm un dword în plus pe stiva int 0x80 ; apel la nucleu add esp , 16 ; curățați stiva push dword 0 ; 0 este codul de ieșire (succes) mov eax , 1 ; 1 este '_exit' syscall push eax ; dword suplimentar pe stiva int 0x80 ; apel la nucleu ; fara curatenie - nu ne vom mai intoarce niciodata Sub sistemul de operare KolibriOS [9] biții 32 % includ secțiunea mos.inc .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 tasta ;buton apăsat; avem un singur buton, închideți tasta MOS_EXIT : ;tasta apăsată, citiți-o și ignorați mov eax , MOS_SC_GETKEY int 0x40 jmp wait_event draw_window : MOS_STARTREDRAW xor eax , eax mov ebx , 10 * 65536 + mov ebx , 10 * 65536 + 15536 ​​+ 15504 mov ecxv edx , 0x33FFFFFF mov edi , header int 0x40 ; define&draw window mov eax , MOS_SC_WRITETEXT mov ebx , 30 * 65536 + 10 mov ecx , 0x80000000 mov edx , șir de caractere mov edx , șir de caractere redo ' dstring string , REDb world string d0string , REDb world string d0string , display REDb world string d string int ; Lumea ! ' , 0 image_end: section .bss alignb 4 stack resb 1024 stacktop: memory_end:

Programe notabile scrise în NASM

  • Asmutils  este un set de utilitare de sistem pentru sistemele de operare BSD, UnixWare, Solaris și AtheOS .
  • Proiectul AsmOS [10]  este un sistem de operare în asamblatorul NASM (în prezent în curs de dezvoltare).

Note

  1. Proiectul nasm Open Source pe Open Hub: Pagina de limbi - 2006.
  2. 1.1 Ce este NASM? (link indisponibil) . Asamblatorul Netwide: NASM . Site-ul oficial. - „NASM, este un asamblator 80x86 și x86-64”. Consultat la 14 iulie 2010. Arhivat din original la 18 februarie 2012. 
  3. Assemblers for Linux: Comparing GAS and NASM . Preluat la 14 iulie 2010. Arhivat din original la 16 august 2011.
  4. 1 2 Utilizarea NASM Assembly pe Windows (downlink) . Data accesului: 17 iulie 2010. Arhivat din original pe 20 iulie 2009. 
  5. 1 2 Randall Hyde. Care asamblator este cel mai bun?  (engleză)  (link inaccesibil) . Data accesului: 18 iulie 2010. Arhivat din original la 18 februarie 2012.
  6. Suport pentru sintaxa Intel apelată prin directiva specială .intel_syntax, apărută în gas-2.10; vezi gaz/STIRI  (eng.)  (downlink) . Data accesului: 18 iulie 2010. Arhivat din original la 18 februarie 2012.
  7. C.2.33 Versiunea 0.98.09b cu patch-uri John Coffman lansate pe 28-oct-2001 (downlink) . Asamblatorul Netwide: NASM. Anexa C: Istoricul versiunilor NASM . Site-ul oficial. Data accesului: 18 iulie 2010. Arhivat din original la 18 februarie 2012. 
  8. Capitolul 7: Formate de ieșire (downlink) . Asamblatorul Netwide: NASM . Site-ul oficial. Consultat la 14 iulie 2010. Arhivat din original la 18 februarie 2012. 
  9. Utilizarea diferitelor compilatoare în Hummingbirds . Consultat la 10 februarie 2022. Arhivat din original pe 10 februarie 2022.
  10. Sistem de operare în asamblatorul NASM . Consultat la 5 iulie 2010. Arhivat din original la 20 octombrie 2011.

Literatură

Link -uri