Zoeken…


Microsoft Assembler - MASM

Aangezien de 8086/8088 werd gebruikt in de IBM PC en het besturingssysteem daarop meestal van Microsoft was, was Microsoft's assembler MASM de feitelijke standaard voor vele jaren. Het volgde de syntaxis van Intel op de voet, maar stond een handige maar "losse" syntaxis toe die (achteraf gezien) alleen voor verwarring en fouten in code zorgde.

Een perfect voorbeeld is als volgt:

MaxSize      EQU     16          ; Define a constant
Symbol       DW      0x1234      ; Define a 16-bit WORD called Symbol to hold 0x1234

             MOV     AX, 10      ; AX now holds 10
             MOV     BX, MaxSize ; BX now holds 16
             MOV     CX, Symbol  ; ????

Zet de laatste MOV instructie de inhoud van Symbol in CX of het adres van Symbol in CX ? Komt CX uit op 0x1234 of 0x0102 (of wat dan ook)? Het blijkt dat CX eindigt met 0x1234 - als u het adres wilt, moet u de OFFSET specificator gebruiken

             MOV     AX, [Symbol]      ; Contents of Symbol
             MOV     CX, OFFSET Symbol ; Address of Symbol

Intel-assembler

Intel schreef de specificatie van de 8086-assembler, een afgeleide van de eerdere 8080-, 8008- en 4004-processors. Als zodanig volgde de assembler die ze schreven precies hun eigen syntaxis. Deze assembler werd echter niet erg veel gebruikt.

Intel definieerde hun opcodes als nul, één of twee operanden. De instructies voor twee operanden werden gedefinieerd als in de dest , source volgorde, die op dat moment anders was dan andere assemblers. Maar sommige instructies gebruikten impliciete registers als operanden - je moest gewoon weten wat ze waren. Intel gebruikte ook het concept van "prefix" opcodes - één opcode zou de volgende instructie beïnvloeden.

; Zero operand examples
NOP             ; No parameters
CBW             ; Convert byte in AL into word in AX
MOVSB           ; Move byte pointed to by DS:SI to byte pointed to by ES:DI
                ; SI and DI are incremented or decremented according to D bit

; Prefix examples
REP   MOVSB     ; Move number of bytes in CX from DS:SI to ES:DI
                ; SI and DI are incremented or decremented according to D bit

; One operand examples
NOT      AX     ; Replace AX with its one's complement
MUL      CX     ; Multiply AX by CX and put 32-bit result in DX:AX

; Two operand examples
MOV      AL, [0x1234] ; Copy the contents of memory location DS:0x1234 into AL register

Intel brak ook een conventie die door andere assemblers werd gebruikt: voor elke opcode werd een andere mnemonic bedacht. Dit vereiste subtiel of duidelijk verschillende namen voor vergelijkbare bewerkingen: bijv. LDM voor "Laden uit geheugen" en LDI voor "Direct laden". Intel gebruikte de ene mnemonische MOV - en verwachtte van de assembler dat hij zou bepalen welke opcode uit de context moest worden gebruikt. Dat veroorzaakte in de toekomst veel valkuilen en fouten voor programmeurs toen de assembler niet kon begrijpen wat de programmeur eigenlijk wilde ...

AT&T assembler - as

Hoewel de 8086 het meest werd gebruikt in IBM-pc's samen met Microsoft, waren er een aantal andere computers en besturingssystemen die het ook gebruikten: met name Unix. Dat was een product van AT&T en Unix had al een aantal andere architecturen. Die architecturen gebruikten meer conventionele syntaxis van de assemblage - vooral omdat instructies in twee operanden ze in source , dest volgorde specificeerden.

Dus AT & T-assemblerconventies hebben de conventies van Intel overschreven en er is een geheel nieuw dialect geïntroduceerd voor het x86-assortiment:

  • Registernamen werden voorafgegaan door % :
    %al , %bx etc.
  • Onmiddellijke waarden werden geprefereerd door $ :
    $4
  • Operanden waren in source , dest volgorde
  • Opcodes bevatten hun operandgroottes:
    movw $4, %ax ; Move word 4 into AX

Borland's Turbo Assembler - TASM

Borland begon met een Pascal-compiler die ze "Turbo Pascal" noemden. Dit werd gevolgd door compilers voor andere talen: C / C ++, Prolog en Fortran. Ze produceerden ook een assembler genaamd "Turbo Assembler", die ze, volgens de naamgevingsconventie van Microsoft, "TASM" noemden.

TASM probeerde enkele van de problemen met het schrijven van code met behulp van MASM op te lossen (zie hierboven), door een striktere interpretatie van de broncode te bieden onder een opgegeven IDEAL modus. Standaard ging het uit van de MASM modus, dus het kon de MASM-bron direct assembleren - maar toen ontdekte Borland dat ze bug-voor-bug compatibel moesten zijn met MASM's meer "eigenzinnige" eigenaardigheden - dus voegden ze ook een QUIRKS modus toe.

Omdat TASM (veel) goedkoper was dan MASM, had het een groot gebruikersbestand - maar niet veel mensen gebruikten de IDEAL-modus, ondanks de aangeprezen voordelen.

GNU assembler - gas

Toen het GNU-project een assembler voor de x86-familie nodig had, gingen ze met de AT&T-versie (en de syntaxis ervan) die werd geassocieerd met Unix in plaats van de Intel / Microsoft-versie.

Netwide Assembler - NASM

NASM is veruit de meest geporteerde assembler voor de x86-architectuur - het is beschikbaar voor vrijwel elk besturingssysteem op basis van de x86 (wordt zelfs meegeleverd met MacOS) en is beschikbaar als een platformonafhankelijke assembler op andere platforms.

Deze assembler gebruikt de syntaxis van Intel, maar is anders dan andere omdat het zwaar gericht is op zijn eigen "macro" -taal - dit stelt de programmeur in staat om complexere uitdrukkingen op te bouwen met behulp van eenvoudigere definities, waardoor nieuwe "instructies" kunnen worden gemaakt.

Helaas brengt deze krachtige functie kosten met zich mee: het type gegevens staat algemene instructies in de weg, zodat het typen van gegevens niet wordt afgedwongen.

response:    db       'Y'     ; Character that user typed

             cmp      response, 'N' ; *** Error! Unknown size!
             cmp byte response, 'N' ; That's better!
             cmp      response, ax  ; No error!

NASM introduceerde echter een functie die anderen misten: scoped symboolnamen. Wanneer u een symbool definieert in andere assemblers, is die naam beschikbaar in de rest van de code - maar die "gebruikt" die naam, "vervuilt" de globale naamruimte met symbolen.

Bijvoorbeeld (met behulp van NASM-syntaxis):

       STRUC     Point
X      resw      1
Y      resw      1
       ENDSTRUC

Na deze definitie zijn X en Y voor altijd gedefinieerd. Om te voorkomen dat de namen X en Y worden "opgebruikt", moest u meer definitieve namen gebruiken:

       STRUC     Point
Pt_X   resw      1
Pt_Y   resw      1
       ENDSTRUC

Maar NASM biedt een alternatief. Door gebruik te maken van het concept "lokale variabele", kunt u structuurvelden definiëren waarvoor u de structuur in toekomstige referenties moet nomineren:

       STRUC      Point
.X     resw       1
.Y     resw       1
       ENDSTRUC

Cursor ISTRUC     Point
       ENDISTRUC

       mov        ax,[Cursor+Point.X]
       mov        dx,[Cursor+Point.Y]

Helaas, omdat NASM de typen niet bijhoudt, kunt u de natuurlijkere syntaxis niet gebruiken:

       mov        ax,[Cursor.X]
       mov        dx,[Cursor.Y]

Yet Another Assembler - YASM

YASM is een complete herschrijving van NASM, maar is compatibel met zowel Intel- als AT&T-syntaxis.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow