Rapid

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 10 septembrie 2022; verificările necesită 10 modificări .

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 ) ( 21.02.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.

Compilare

Compilarea unui program în fasm constă în trei etape: preprocesare, analizare și asamblare.

Preprocesare

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.

Analizare

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.

Asamblare

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

Istorie

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.

Principii

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.

Proces de compilare

Compilarea codului sursă are loc în mai multe etape izolate unele de altele.

Convertirea ieșirii în formatul solicitat

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.

Formatul instrucțiunii

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.

Exemplu de program

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 main

O 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 = $-msg

Format fișier de ieșire

Folosind directiva format, puteți specifica următoarele formate de fișiere de ieșire:

  • MZ - Fișiere executabile DOS .
  • PE - Fișiere executabile Windows (consolă, aplicații grafice și biblioteci dinamice).
    • PE64 - fișiere executabile ale versiunilor de Windows pe 64 de biți.
  • COFF, MS COFF, MS64 COFF sunt fișiere obiect.
  • ELF, ELF64 sunt fișiere executabile pe sisteme asemănătoare Unix .
  • ARM — dezvoltarea entuziaștilor [5] .
  • Binary - fișiere cu structură arbitrară. Specificarea unui offset de 100h ( ) produce un org 100hfișier executabil în format .COM . De format binaryasemenea, puteți compila fișiere de date cu [6] .

Sisteme de operare

Aplicație

Sisteme de operare scrise în FASM:

  • DexOS de Ville Turijanmaa
  • MenuetOS - sisteme de operare grafică pe 32 și 64 de biți de Ville Turijanmaa
  • KolibriOS - un furk al MenuetOS

Compilatoare care folosesc FASM ca asamblator backend:

IDE bazat pe FASM:

  • Fresh este un proiect susținut de comunitate, fondat de John Found

Suport pentru fasm în software terță parte

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.

Note

  1. 1 2 Descărcare asamblare plată  . flatassembler.net . Preluat la 26 august 2019. Arhivat din original la 31 august 2019.
  2. https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
  3. Tomasz Grysztar. Manualul programatorului Flat Assembler  (engleză)  (downlink) . Consultat la 27 mai 2012. Arhivat din original la 31 mai 2012.
  4. Randall Hyde. Care asamblator este cel mai bun?  (engleză)  (link inaccesibil) . Consultat la 27 mai 2012. Arhivat din original la 31 mai 2012.
  5. FASM ARM  . flatassembler.net .
  6. ↑ Subiect de forum oficial despre crearea de imagini cu macrocomenzi fasm  . Preluat la 26 august 2019. Arhivat din original la 4 august 2020.

Link -uri