asamblator plat | |
---|---|
Captură de ecran a FASM cu cod din exemplele furnizate | |
Tip de | compilator |
Dezvoltator | Tomasz Gryshtar |
Scris in | limbaj de asamblare |
Sistem de operare | Sistem de operare asemănător Unix , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS și KolibriOS |
Prima editie | 1999 |
ultima versiune | 1.73.30 [1] (21 februarie 2022 ) |
Formate de fișiere generate | Format executabil și conectabil , COFF și executabil portabil |
Licență | Licență BSD cu 2 clauze [2] |
Site-ul web | flatassembler.net _ |
fasm ( prescurtare de la f lat as se m bler ) este un asamblator gratuit cu mai multe treceri scris de Tomasz Grysztar . fasm este autonom [1] , a fost compilat inițial cu TASM și a putut fi construit din surse native din 4 mai 1999 în versiunea 0.90. fasm este de dimensiuni mici și are o viteză foarte mare de compilaresintaxă macro bogată și încăpătoare care vă permite să automatizați multe sarcini de rutină [3] [4] . Sunt acceptate atât formatele de obiecte, cât și formatele de fișiere executabile. Acest lucru elimină necesitatea unui linker în majoritatea cazurilor . În alte cazuri, trebuie să utilizați linkere terțe, deoarece unul nu este distribuit cu fasm.
Pe lângă setul de instrucțiuni de bază al procesorului și coprocesorului[ ce? ] , fasm acceptă MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , extensii suplimentare AES , CLMUL , FMA , FMA4 , XOP și EM64T și AMD64 (inclusiv AMD SVM și Intel SMX).
Toate variantele de fasm pot crea direct fișiere de ieșire în următoarele formate predefinite în assembler: fișiere obiect (standard pentru majoritatea asamblatorilor): format executabil și linkabil (ELF) sau format de fișier obiect comun (COFF) (clasic sau în specificația Microsoft), fișiere executabile (nu necesită linkere suplimentare): MZ , ELF sau Portable Executable (PE) (driverele WDM incluse, cu posibilitatea de a configura stub MZ DOS). Pentru a genera fișiere într-un alt format decât cele prestabilite, există un format de fișier binar care oferă programatorului control deplin asupra fiecărui octet al fișierului de ieșire, cu toate acestea, programatorul va trebui să descrie întreaga structură, conținut și relații ale unui astfel de fișier direct.
Arhitecturile țintă native sunt arhitecturile IA32 și x86-64 . Există un add - on neoficial fasmarm care are arhitecturi țintă native ARM și ARM64 . Implementarea arhitecturilor țintă, altele decât cea nativă, este similară cu o implementare similară în orice alt asamblator - macro-urile și directivele de definire a datelor sunt utilizate în aceste scopuri.
Compilarea unui program în fasm constă în trei etape: preprocesare, analizare și asamblare.
Prima etapă (preprocesare ) este efectuată într-o singură trecere, mai întâi textul sursă este tokenizat, apoi toate directivele procesorului sunt recunoscute și procesate în el, toate macrourile și toate constantele simbolice sunt extinse. Deoarece nu există treceri suplimentare pentru această etapă, orice element de limbă procesat în această etapă trebuie mai întâi declarat înainte de a putea fi utilizat.
A doua etapă, în această etapă, are loc o clasificare suplimentară a jetoanelor (deoarece chiar și tipurile de jetoane și cerințele pentru acestea în etapele de preprocesare și asamblare sunt ușor diferite), pentru unele jetoane sunt create structuri de proprietate suplimentare, care vor mai târziu, în timpul asamblarii.
În etapa de asamblare, adresele etichetelor sunt determinate , directivele condiționate sunt procesate, buclele sunt deschise și programul propriu-zis este generat. fasm este un asamblator multi-pass, care îi permite să facă unele optimizări (de exemplu, să genereze un salt scurt la o etichetă în loc de unul lung). În timpul unei treceri, compilatorul poate să nu evalueze întotdeauna expresia în directive condiționale. În acest caz, face o alegere și încearcă să compileze mai departe. Deoarece adresele etichetelor calculate în trecerea a N-a sunt utilizate în trecerea N+1, acest proces converge de obicei.
Proiectul a fost început în 1999 de Tomasz Grysztar ( poloneză: Tomasz Grysztar ), care era student la acea vreme. Codul sursă a fost scris în întregime în limbajul de asamblare TASM . Începând cu versiunea 0.90 (4 mai 1999), asamblatorul fasm a devenit autosuficient (codul său sursă a fost adaptat la dialectul nativ și asamblat chiar de asamblatorul fasm). În martie 2000, fasm a fost publicat pe internet.
Inițial, fasm rula doar din modul real plat pe 16 biți . Apoi a fost adăugat suportul pe 32 de biți și, în plus, suportul DPMI . Codul sursă a fost rescris astfel încât să poată fi portat cu ușurință pe orice sistem de operare x86 care acceptă adresarea pe 32 de biți. A fost portat pe Windows, apoi pe Linux.
Fasm tinde să folosească cel mai mic set posibil de directive de preprocesor, de exemplu. într-un set predefinit de directive nu este permisă introducerea de noi directive, a căror funcționalitate poate fi realizată printr-un set existent de directive. Excepțiile sunt directivele interschimbabile din punct de vedere istoric.
Fasm este un asamblator multi-pass cu predicție optimistă, de exemplu. la prima trecere, asamblatorul presupune că toate instrucțiunile iau forma lor cea mai mică posibilă. Multi-passing permite, de asemenea, utilizarea expresiilor pe termen nelimitat înainte de a fi declarate.
Fasm nu include declarații de proceduri neutilizate în fișierul de ieșire (implementat prin macrocomenzi).
Conținutul fișierului de ieșire depinde doar de conținutul codului sursă și nu depinde de mediul sistemului de operare sau de parametrii trecuți pe linia de comandă. Pentru cei cărora acest principiu le-a fost incomod pentru win32, a fost dezvoltat învelișul FA , care vă permite să conectați un alt fișier la fișier nu direct în cod, ci prin linia de comandă.
Codul sursă pentru fasm poate fi încorporat direct într-un fișier executabil, ocolind etapele creării fișierelor obiect intermediare și legarea acestora.
Compilarea codului sursă are loc în mai multe etape izolate unele de altele.
Blocurile de date de ieșire sunt încadrate cu anteturile necesare pentru format, datele și relațiile antet sunt procesate, se calculează sumele de control, dimensiunile blocurilor... Se generează un fișier de ieșire.
Se folosește sintaxa Intel pentru scrierea instrucțiunilor.
Singura diferență semnificativă față de formatul adoptat în alte asamblatoare ( MASM , TASM în modul de compatibilitate MASM) este că valoarea unei celule de memorie este întotdeauna scrisă ca [label_name], dar label_nameînseamnă pur și simplu adresa (adică numărul de serie) al celulei. Acest lucru vă permite să faceți fără cuvântul cheie offset. De asemenea, în fasm, atunci când redefiniți dimensiunea unui operand, byte ptrse scrie pur și simplu în loc de byte, în loc de word ptr - , etc. Nu este wordpermisă folosirea mai multor paranteze pătrate într-un singur operand - astfel, [bx][si]trebuie să scrieți în loc [bx+si]. Aceste modificări de sintaxă au dus la un cod mai unificat și mai ușor de citit.
Un exemplu de program Windows Salut, lume! ”, care tipărește acest mesaj cu o funcție MessageBoxși se termină cu:
format pe gui 4 .0 intrarea start include „ win32a.inc ” start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 mesaj db ' Salut , lume ! ' , 0 biblioteca de import de date kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' includ ' api / kernel32.inc ' includ datele finale ' api / user32.inc 'Sau cam asa:
includeți „ win32ax.inc ” .code principal: invoke MessageBox , NULL , „ Hello , World ! ' , ' Fasm message box : ' , MB_OK invoke ExitProcess , 0 .end mainO versiune mai complicată, cu clarificarea secțiunilor din fișierul PE :
format pe gui intrarea start include „ win32a.inc ” secţiunea ' .date ' date citibile scriptibile mesaj db ' Salut , lume ! ' , 0 secțiunea ' .code ' cod executabil citibil start: invoke MessageBox , NULL , message , message , MB_OK invoke ExitProcess , 0 secțiunea „ .idata ” import date bibliotecă care poate fi citită kernel32 , „ kernel32.dll ” , \ user32 , „ user32.dll ” import kernel32 , \ ExitProcess , „ ExitProcess ” import user32 , \ MessageBox , „ MessageBoxA ”Un exemplu de program de consolă simplu în format .COM :
org 100h _ mov ah , 9 h mov dx , salut int 21 h mov ah , 8 h int 21 h int 20 h salut db 13 , 10 , " Salut , lume ! $ "Un exemplu de program simplu în format ELF .
format ELF executabil 3 intrare start executabil care poate fi citit pe segment începe: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1xor ebx , ebx int 0x80 _ segment care poate fi citit și poate fi scris msg db „ Bună lume ! ' , 0xA msg_size = $-msgFolosind directiva format, puteți specifica următoarele formate de fișiere de ieșire:
Sisteme de operare scrise în FASM:
Compilatoare care folosesc FASM ca asamblator backend:
IDE bazat pe FASM:
Fișierul de suport pentru sintaxă fasm vine cu pachetul de bază Vim .
Utilizarea fasm este susținută de multe IDE -uri specializate, cum ar fi RadASM , WinAsm Studio , Fresh (special conceput pentru fasm) etc.
limbaj de asamblare | |
---|---|
IDE | |
Traducători | |
Formate de sintaxă |