- Assembly jazyk organizuje svoje inštrukcie podľa účelu: prenos, výpočet, riadenie toku a ďalšie.
- Každá inštrukcia pozostáva z operačného kódu a operandov, s rôznymi formátmi v závislosti od architektúry.
- Existuje niekoľko spôsobov adresovania pre prístup k údajom, ako napríklad okamžitý, priamy a nepriamy.
Assembly jazyk bol jedným zo základných pilierov vývoja softvéru od počiatkov informatiky. Hoci dnes scéne dominujú programovacie jazyky vyššej úrovne, assembler zostáva široko používaný a relevantný v prostrediach, kde je prioritou riadenie hardvéru, optimalizácia alebo obmedzenia zdrojov.
V tomto článku sa ponoríme do typov inštrukcií v assemblerovom jazyku, analyzujeme ich štruktúru, účel, režimy adresovania a spôsob, akým sú organizované v rôznych architektúrach. Nájdete tu aj príklady, formáty a komplexný prehľad, ktorý vám umožní plne pochopiť logiku týchto inštrukcií, ktoré úzko spolupracujú s hardvérom.
Čo je to inštrukcia v assemblerskom jazyku?
Assemblerová inštrukcia je príkaz, ktorému procesor priamo rozumie (po preložení do strojového kódu assemblerovým programom). Každá inštrukcia má špecifický účel a zvyčajne sa skladá z mnemotechnickej pomôcky , ktorá predstavuje operáciu, a jedného alebo viacerých operandov , ktoré označujú, kde sa údaje berú a/alebo kde sa ukladajú výsledky.
Tieto inštrukcie sú vysoko závislé od architektúry procesora, takže každý typ CPU (či už ide o x86, ARM, MIPS a ďalšie) má vlastnú sadu inštrukcií so špecifickou syntaxou a schopnosťami.
Štruktúra inštrukcie
Pokyny sa zvyčajne skladajú z dvoch častí:
- Operačný kód (opcode): Označuje akciu, ktorá sa má vykonať, ako napríklad sčítanie, presúvanie údajov, porovnávanie atď.
Operandy poskytujú informácie potrebné na vykonanie operácie a môžu byť uložené v registroch, pamäti alebo môžu byť konštanty. Nie všetky inštrukcie vyžadujú operandy a v niektorých prípadoch môžu byť implicitne obsiahnuté v inštrukcii alebo uložené v preddefinovaných registroch.
Typy inštrukcií v assemblerovom jazyku
V závislosti od funkcionality, ktorú vykonávajú v programe, možno inštrukcie v assemblerovom jazyku rozdeliť do niekoľkých skupín. Najrelevantnejšie sú podrobne uvedené nižšie:
1. Pokyny na prenos údajov
Tieto inštrukcie umožňujú kopírovanie údajov z jedného miesta na druhé bez zmeny ich obsahu v zdroji. Sú nevyhnutné na presun informácií medzi registrami, pamäťou a perifériami.
Niektoré z najbežnejších pokynov v tejto skupine sú:
- MOV: Skopíruje obsah jedného operandu do druhého. Napríklad,
MOV AX, BXskopírujte obsah BX do AX. - MOVS / MOVSB / MOVSW: Presunie reťazce zo zdrojovej adresy (SI) na cieľovú adresu (DI), čím automatizuje proces prenosu.
- LODS / LODSB / LODSW: Načíta hodnotu z adresy indikovanej registrom SI do akumulátora (AL alebo AX).
- PREČÍTAJTE SI: Namiesto hodnoty načíta efektívnu adresu. Užitočné na získanie adresy premennej alebo štruktúry.
2. Pokyny k batérii
Zásobník je štruktúra LIFO (last in, first out - posledný dnu, prvý von), ktorá sa používa na dočasné ukladanie údajov, odovzdávanie parametrov alebo ukladanie kontextu vykonávania.
- TLAČIŤ: Uloží hodnotu na zásobník a zníži hodnotu ukazovateľa SP.
- POP: Načíta najnovšiu hodnotu uloženú v zásobníku, pričom zvýši SP.
- TLAČENIE / POPF: Ukladajú a načítavajú stav príznakov CPU na zásobníku.
3. Aritmetické a logické inštrukcie
Umožňujú vykonávanie výpočtov a operácií s bitmi. Tieto inštrukcie sú nevyhnutné pre manipuláciu s numerickými údajmi a prijímanie rozhodnutí v priebehu programu.
Medzi najpoužívanejšie nájdeme:
- PRIDAŤ / PODPÍSAŤ: Sčítanie a odčítanie.
- MUL / IMUL: Binárne násobenia.
- DIV / IDIV: Delenie (celočíselné alebo so znamienkom).
- A / ALEBO / XOR / NIE: Bitové logické operácie.
- SHL / SHR / ROL / ROR: Posuny a rotácie bitov.
4. Pokyny na riadenie toku
Umožňujú vám upraviť postupnosť vykonávania programu zavedením skokov alebo podmienených a nepodmienených volaní iných inštrukcií.
- ŽMP: Bezpodmienečne preskočí na inú adresu v programe.
- VOLAJ / VRÁTI: Zavolajte podprogram a vráťte sa.
- JE/JNE/JG/JL/JZ/JNZ: Podmienené skoky, vykonávajú sa, ak sú splnené určité podmienky (po porovnaní).
5. Vstupno-výstupné (I/O) inštrukcie
Umožňujú komunikáciu medzi procesorom a externými zariadeniami. Tieto inštrukcie umožňujú čítanie a zápis údajov do/z portov (hardvér).
- IN: Číta dáta zo vstupného portu.
- VON: Odosiela dáta do výstupného portu.
6. Inštrukcie s pohyblivou desatinnou čiarkou
Mnohé CPU majú matematické koprocesory (alebo špeciálne inštrukcie) určené na prácu s desatinnými číslami (s pohyblivou desatinnou čiarkou). Tieto inštrukcie umožňujú operácie ako:
- Sčítanie, odčítanie, násobenie a delenie reálnych čísel.
- Goniometrické operácie (sínus, kosínus, tangens).
- Logaritmické, exponenciálne a odmocninové operácie.
Tieto inštrukcie zvyčajne spĺňajú normu IEEE 754 pre numerickú presnosť.
Režimy adresovania
Základnou súčasťou návrhu inštrukcií je spôsob identifikácie umiestnenia operandov. Režimy adresovania definujú, ako CPU pristupuje k údajom.
1. Okamžité adresovanie
Dáta sú zahrnuté priamo v inštrukcii. Je to rýchle, ale neumožňuje to úpravu hodnôt bez zmeny inštrukcie.
MOV AX, 5
2. Priame adresovanie
Adresa pamäte obsahujúca dáta je explicitne zadaná.
MOV AX,
3. Nepriame adresovanie
Efektívna adresa sa získa z obsahu záznamu. Je veľmi flexibilná a používa sa pre štruktúry a prepojené zoznamy.
MOV AX,
4. Indexované adresovanie
Adresa sa vypočíta sčítaním základnej súradnice a indexu (napríklad na prechádzanie poliami). Používa špeciálne registre, ako napríklad SI, DI alebo registre základnej súradnice a offsetu.
MOV AX,
Formáty inštrukcií: rôzne typy v závislosti od architektúry
Štruktúra inštrukcie sa môže líšiť v závislosti od architektúry. Medzi bežné formáty patria:
4-cestný formát
Obsahuje dva operandy, umiestnenie výsledku a adresu nasledujúcej inštrukcie. V súčasnosti je kvôli svojej zložitosti zastaraný.
3-cestný formát
Špecifikuje dva operandy a cieľovú adresu. Je bežný v moderných architektúrach RISC.
2-cestný formát
Použite zdrojový operand a cieľový operand (cieľ môže tiež prispievať hodnotou). Populárne na architektúrach x86 a iných CISC.
Jednosmerný formát
Je zadaný iba jeden operand; druhý sa považuje za akumulátor. Bežné v starších procesoroch a jednoduchých systémoch.
Formát 0-adresy (založený na zásobníku)
Operácie používajú zásobník na načítanie a ukladanie operandov a výsledkov. Veľmi efektívne pre stroje založené na zásobníku, ako sú napríklad niektoré programovateľné kalkulačky.
Makro inštrukcie a pseudokódy operácií
Na zvýšenie produktivity mnoho assemblerov ponúka makroinštrukcie , ktoré rozširujú jeden riadok do niekoľkých skutočných inštrukcií. Tieto sú užitočné na zabránenie opakovaniu zložitých vzorov alebo na vytváranie štruktúr na vysokej úrovni, ako sú slučky alebo podmienené príkazy.
undefined pseudo-operačné kódy Sú to inštrukcie, ktoré assembler interne prekladá do skutočnej postupnosti inštrukcií. Napríklad, NOP (bez operácie) sa dá preložiť ako XCHG AX, AX na procesore x86.
Direktívy assembleru
Direktívy ( nazývané aj pseudooperácie ) nie sú inštrukcie v pravom slova zmysle. Slúžia na riadenie procesu zostavovania, definovanie údajov, sekcií kódu, makier, podmienok kompilácie atď.
Bežné príklady zahŕňajú:
- .dáta / .kód: Označujú dátovú alebo kódovú sekciu.
- .org: Nastaví adresu, z ktorej sa spustí zostavenie.
- .equ: Definuje symbolické konštanty.
Prípady použitia assemblerového jazyka
Napriek nárastu používania programovacích jazykov na vysokej úrovni zostáva assembler kľúčový v niekoľkých oblastiach:
- Vývoj vstavaných systémov a mikrokontrolérov.
- Programovanie ovládačov, bootloaderov a BIOSu.
- Extrémna optimalizácia v aplikáciách ako sú videohry alebo kryptografia.
- Reverzné inžinierstvo, ladenie a nízkoúrovňové hackovanie.
Okrem toho, výučba assemblerového jazyka stále zaujíma dôležité miesto v odbore informatika a elektronika, pretože poskytuje hlboké pochopenie toho, ako procesor funguje, ako sa ukladajú a manipulujú s dátami a ako sa inštrukcie vykonávajú na binárnej úrovni.
Pochopenie všetkých typov assemblerových inštrukcií, ich štruktúry, funkčnosti a režimov adresovania poskytuje solídny základ pre každého programátora, ktorý sa chce ponoriť do nízkoúrovňového programovania alebo pochopiť, ako sa vysokoúrovňové jazyky nakoniec prekladajú do strojového kódu. Hoci sa jeho použitie stalo špecifickejším, zostáva nevyhnutným nástrojom vo viacerých kritických oblastiach vývoja softvéru a systémov.