Otwórz menu główne

Asembler x86 – język programowania z rodziny asemblerów do komputerów klasy PC, które posiadają architekturę głównego procesora zgodną z x86.

Asembler x86 ma dwie najpopularniejsze składnie zwane zwyczajowo: „składnią Intela” i „składnią AT&T”. Pierwsza z nich jest głównie używana przez firmę Intel w dokumentacji dot. swoich produktów i była najczęściej używaną składnią przez narzędzia w systemach DOS i Windows. Druga składnia jest typowo używana w systemach UNIX i Uniksopodobnych. Ponieważ kod w języku asemblera jest niskopoziomowy, istnieją automatyczne translatory między obydwoma składniami.

Możliwości i zasady wykorzystania asemblera x86 są zależne od systemu operacyjnego oraz kompilatora, różne są także sposoby komunikacji asemblera z innymi językami programowania.

Spis treści

KonwencjeEdytuj

W składni i metodach programowania za pomocą danej składni asemblera x86 wykorzystuje się kilka ogólnie przyjętych (bądź sprzętowo narzuconych) konwencji. Przykładowo dla „składni Intela” są to m.in.:

  • operand docelowy instrukcji jest podawany jako pierwszy z operandów, np. instrukcja:
mov ax, bx
spowoduje wpisanie zawartości rejestru BX do rejestru AX.
(w przypadku „składni AT&T” jest odwrotnie)
  • kolejność bajtów w procesorach zgodnych z x86 to little-endian (mniej znaczący bajt pierwszy).

PrzykładyEdytuj

Poniżej dwa przykłady, możliwe do skompilowania w systemie Linux: pierwszy można skompilować przy użyciu nasm, drugi – asemblerem z binutils (lub samym gcc jeśli ma on rozszerzenie .s). Linkowanie w obu przypadkach gcc lub ręcznie.

Kompilacja pierwszego:

nasm -f elf -o beer.o beer.asm && gcc -s -o beer beer.o

Kompilacja drugiego:

gcc -s -o beer beer.s

Przykład składni Intela – program "99 Bottles of Beer" (ang. 99 butelek piwa)Edytuj

global main
extern printf

section .data

beer    db      "%d bottles of beer on the wall, %d bottles of beer."
        db      0x0a
        db      "Take one down and pass it around, %d bottles of beer."
        db      0x0a
        db      0

main:
        mov ecx, 99

_loop:
        dec  ecx
        push ecx
        push ecx
        inc  ecx
        push ecx
        push ecx
        push beer
        call printf
        add  esp,16
        pop  ecx
        or   ecx, ecx
        jne  _loop
        xor  eax,eax
        ret

Przykład składni AT&T – ten sam program - "99 Bottles of Beer" (ang. 99 butelek piwa)Edytuj

.section .rodata
.beer:
.ascii "%d bottles of Beer on the wall, %d bottles of Beer.\n"
.asciz "Take one down and pass it around, %d bottles of Beer.\n"

.text
.global main
main:

mov $99, %ecx

loop:
dec   %ecx
push  %ecx
push  %ecx
inc   %ecx
push  %ecx
push  %ecx
pushl $.beer
call  printf
add   $16,%esp
pop   %ecx
or    %ecx, %ecx
jne   loop
xorl  %eax,%eax
ret


Zobacz teżEdytuj