Sök…


Microsoft Assembler - MASM

Med tanke på att 8086/8088 användes i IBM PC och operativsystemet på det oftast kom från Microsoft, var Microsofts montör MASM de facto standard i många år. Den följde Intels syntax noggrant, men tillät en del bekväm men "lös" syntax som (i efterhand) endast orsakade förvirring och kodfel.

Ett perfekt exempel är följande:

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  ; ????

Sätter den senaste MOV instruktionen innehållet i Symbol i CX , eller adressen till Symbol i CX ? Slutar CX med 0x1234 eller 0x0102 (eller vad som helst)? Det visar sig att CX slutar med 0x1234 - om du vill ha adressen måste du använda OFFSET specifikatorn

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

Intel Assembler

Intel skrev specifikationen för monteringsspråket 8086, ett derivat av de tidigare 8080, 8008 och 4004 processorerna. Som sådan följde samlaren de skrev sin egen syntax exakt. Men denna monterare användes inte så mycket.

Intel definierade sina opcoder för att ha antingen noll, en eller två operander. De två-operand instruktioner definierades vara i dest , source ordning, som var annorlunda från andra montörer på tiden. Men vissa instruktioner använde implicita register som operander - du måste bara veta vad de var. Intel använde också begreppet "prefix" -koder - en opcode skulle påverka nästa instruktion.

; 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 bröt också en konvention som användes av andra monterare: för varje opcode uppfanns en annan mnemonic. Detta krävde subtila eller tydligt olika namn för liknande operationer: t.ex. LDM för "Load from Memory" och LDI för "Load Immediate". Intel använde den enda mnemoniska MOV - och förväntade sig att monteraren skulle räkna ut vilken opcode som ska användas från sammanhang. Det orsakade många fallgropar och fel för programmerare i framtiden när montören inte kunde intuitera vad programmeraren faktiskt ville ...

AT&T monterare - som

Även om 8086 användes mest på IBM-datorer tillsammans med Microsoft, fanns det ett antal andra datorer och operativsystem som också använde det: särskilt Unix. Det var en produkt av AT&T, och Unix körde redan på ett antal andra arkitekturer. Dessa arkitekturer använde mer konventionell montagesyntax - särskilt att två-operand instruktioner specificerade dem i source , dest order.

Så AT&T monteringskonventioner överträffar de konventioner som dikterats av Intel, och en helt ny dialekt infördes för x86-sortimentet:

  • Registernamnen förinställdes med % :
    %al , %bx etc.
  • Omedelbara värden föredrades av $ :
    $4
  • Operander var i source , dest ordning
  • Opcodes inkluderade deras operandstorlekar:
    movw $4, %ax ; Move word 4 into AX

Borlands Turbo Assembler - TASM

Borland började med en Pascal-kompilator som de kallade "Turbo Pascal". Detta följdes av kompilatorer för andra språk: C / C ++, Prolog och Fortran. De producerade också en monterare som heter "Turbo Assembler", som de efter Microsofts namnkonvention kallade "TASM".

TASM försökte fixa några av problemen med att skriva kod med MASM (se ovan) genom att tillhandahålla en striktare tolkning av källkoden under ett specifikt IDEAL läge. Som standard antog det MASM läge, så det kunde montera MASM-källa direkt - men då fann Borland att de måste vara bug-for-bug-kompatibla med MASM: s mer "knäppa" idiosynkratier - så de lägger också till ett QUIRKS läge.

Eftersom TASM var (mycket) billigare än MASM hade den en stor användarbas - men inte många använde IDEAL-läget, trots dess utmärkta fördelar.

GNU-monterare - gas

När GNU-projektet behövde en samlare för x86-familjen gick de med AT&T-versionen (och dess syntax) som var associerad med Unix snarare än Intel / Microsoft-versionen.

Netwide Assembler - NASM

NASM är den överlägset mest porterade monteraren för x86-arkitekturen - den är tillgänglig för praktiskt taget alla operativsystem baserade på x86 (till och med ingår i MacOS), och är tillgänglig som en plattformsmonterare på andra plattformar.

Denna monterare använder Intel-syntax, men den skiljer sig från andra eftersom den fokuserar starkt på sitt eget "makrospråk" - detta tillåter programmeraren att bygga upp mer komplexa uttryck med enklare definitioner, vilket gör att nya "instruktioner" kan skapas.

Tyvärr kommer den här kraftfulla funktionen till en kostnad: datatypen kommer i vägen för allmänna instruktioner, så datatypen inte verkställs.

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!

Emellertid introducerade NASM en funktion som andra saknade: scoped-symbolnamn. När du definierar en symbol i andra samlare, är det namnet tillgängligt under resten av koden - men som "använder upp" det namnet, "förorenar" det globala namnutrymmet med symboler.

Till exempel (med NASM-syntax):

       STRUC     Point
X      resw      1
Y      resw      1
       ENDSTRUC

Efter denna definition definieras X och Y för alltid. För att undvika att "använda" namnen X och Y , behövde du använda mer bestämda namn:

       STRUC     Point
Pt_X   resw      1
Pt_Y   resw      1
       ENDSTRUC

Men NASM erbjuder ett alternativ. Genom att utnyttja sitt "lokala variabla" -koncept kan du definiera strukturfält som kräver att du nominerar den innehållande strukturen i framtida referenser:

       STRUC      Point
.X     resw       1
.Y     resw       1
       ENDSTRUC

Cursor ISTRUC     Point
       ENDISTRUC

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

Tyvärr, eftersom NASM inte håller reda på typer, kan du inte använda den mer naturliga syntaxen:

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

Ytterligare en monterare - YASM

YASM är en komplett omskrivning av NASM, men är kompatibel med både Intel- och AT&T-syntaxer.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow