VOOZH about

URL: https://pl.wikipedia.org/wiki/Asembler_x86

⇱ Asembler x86 – Wikipedia, wolna encyklopedia


Przejdź do zawartości
Z Wikipedii, wolnej encyklopedii
Ten artykuł od 2020-11 wymaga zweryfikowania podanych informacji.
Należy podać wiarygodne źródła w formie przypisów bibliograficznych.
Część lub nawet wszystkie informacje w artykule mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte.
Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary)
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.

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

W rzeczywistości jest to kilka różnych języków używanych do zapisu tych samych instrukcji i dyrektyw, różniących się składnią.

Trzy najpopularniejsze składnie to:

  • składnia Intel/Microsoft - używana w asemblerze MASM firmy Microsoft i w przykładach zamieszczonych w dokumentacji firmowej procesorów Intel rodziny x86; dawniej korzystała z niej większość narzędzi programistycznych dla systemów DOS i Windows.
  • składnia NASM - używana w asemblerze NASM, podobna do składni Intel/Microsoft, ale uproszczona i pozbawiona niejednoznaczności zapisu
  • składnia AT&T - używana w systemach UNIX i uniksopodobnych.

Ponieważ kod w języku asemblera jest niskopoziomowy, istnieją automatyczne translatory między obydwoma składniami.

Konwencje

[edytuj | edytuj kod]

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 Intel/Microsoft i NASM 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).

Różnice pomiędzy NASM a Intel/Microsoft

[edytuj | edytuj kod]

Oprócz prostszego zapisu dyrektyw i atrybutów, NASM eliminuje niejednoznaczności zapisu składni Intel/Microsoft.

MASM (Intel/Microsoft)

[edytuj | edytuj kod]

W składni MASM interpretacja argumentu operacji przez asembler zależy od sposobu jego wcześniejszego zdefiniowania - w przykładzie poniżej argumenty x i y mają różną interpretację, a zapis [x] jest interpretowany podobnie do zapisu y.

xequ1000; definicja symbolu x o wartości 1000
ydd123; definicja zmiennej y o wartości początkowej 123, zajmującej 32 bity

moveax,x; ładuje stałą 1000
movebx,[x]; ładuje wartość danej spod adresu 1000
movedx,y; ładuje WARTOŚĆ zmiennej y
movedx,[y]; ładuje wartość zmiennej y, tak samo, jak linia powyżej
movecx,offsety; ładuje adres zmiennej y
movzxeax,byteptry; ładuje bajt spod adresu y z rozszerzeniem zerami do 32 bitów
moveax,8[ebp]; ładuje daną spod adresu ebp+8

Każde odwołanie do danej w pamięci jest w składni NASM oznaczone nawiasami kwadratowymi. Brak nawiasów oznacza stałą lub adres.

xequ1000; definicja symbolu x o wartości 1000
ydd123; definicja zmiennej y o wartości początkowej 123, zajmującej 32 bity

moveax,x; ładuje stałą 1000
movebx,[x]; ładuje wartość danej spod adresu 1000
movedx,y; ładuje ADRES zmiennej y
movedx,[y]; ładuje wartość zmiennej y
movzxeax,byte[y]; ładuje bajt spod adresu y zrozszerzeniem zerami do 32 bitów
moveax,[ebp+8]; ładuje daną spod adresu ebp+8

Przykłady programów

[edytuj | edytuj kod]

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 elf32 beer.asm && gcc -s -o beer beer.o

Kompilacja drugiego:

gcc -s -o beer beer.s

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

[edytuj | edytuj kod]
globalmain
externprintf

section.data

beerdb"%dbottlesofbeeronthewall,%dbottlesofbeer."
db0x0a
db"Takeonedownandpassitaround,%dbottlesofbeer."
db0x0a
db0

main:
movecx,99

_loop:
dececx
pushecx
pushecx
incecx
pushecx
pushecx
pushbeer
callprintf
addesp,16
popecx
orecx,ecx
jne_loop
xoreax,eax
ret

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

[edytuj | edytuj kod]
.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
.globalmain
main:

mov$99,%ecx

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


👁 Image
Zobacz publikację
Asembler X86 w Wikibooks

Zobacz też

[edytuj | edytuj kod]

Przypisy

[edytuj | edytuj kod]
  1. Guide to x86 Assembly [online], www.cs.virginia.edu [dostęp 2022-10-24].