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 x86 – ję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
NASM
[edytuj | edytuj kod]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]- IA-32
- mikroprocesory firmy Intel
- MMX
- SSE, SSE2, SSE3, SSSE3, SSE4, SSE5
- AVX
- adres pamięci
- Rejestry procesorów x86
Przypisy
[edytuj | edytuj kod]- ↑ Guide to x86 Assembly [online], www.cs.virginia.edu [dostęp 2022-10-24].
