- Asemblerski jezik organizira svoje instrukcije prema namjeni: prijenos, izračun, kontrola protoka i drugo.
- Svaka instrukcija se sastoji od opcode-a i operanada, s različitim formatima ovisno o arhitekturi.
- Postoji nekoliko načina adresiranja za pristup podacima, kao što su neposredni, izravni i neizravni.
Asemblerski jezik je jedan od temeljnih stupova razvoja softvera od samih početaka računarstva. Iako danas dominiraju programski jezici visoke razine, asembler ostaje široko korišten i relevantan u okruženjima gdje su prioritet kontrola hardvera, optimizacija ili ograničenja resursa.
U ovom članku ćemo se detaljno pozabaviti vrstama instrukcija asemblerskog jezika, analizirajući njihovu strukturu, namjenu, načine adresiranja i kako su organizirane u različitim arhitekturama. Osim toga, naučit ćete primjere, formate i sveobuhvatan pregled koji će vam omogućiti da u potpunosti razumijete logiku iza ovih instrukcija, koje djeluju vrlo blisko hardveru.
Što je instrukcija u asemblerskom jeziku?
Una asemblerske instrukcije To je naredba koju CPU može izravno razumjeti (nakon što je asemblerski program preveo u strojni kod). Svaka instrukcija ima određenu svrhu i obično se sastoji od mnemonički koji predstavlja operaciju i jednu ili više operandi koji pokazuju gdje se podaci uzimaju i/ili gdje se rezultati pohranjuju.
Ove instrukcije uvelike ovise o arhitekturi procesora, tako da svaka vrsta CPU-a (bilo da se radi o x86, ARM-u, MIPS-u, između ostalih) ima svoj vlastiti skup instrukcija s određenom sintaksom i mogućnostima.
Struktura instrukcije
Upute se obično sastoje od dva dijela:
- Operacijski kod (opcode): Označava radnju koja se treba izvršiti, kao što su dodavanje, premještanje podataka, uspoređivanje itd.
Operandi pružaju informacije potrebne za izvođenje operacije i mogu biti u registrima, memoriji ili konstantama. Nisu sve upute Zahtijevaju operande, a u nekim slučajevima oni mogu biti implicitni u instrukciji ili u unaprijed definiranim registrima.
Vrste instrukcija u asemblerskom jeziku
Ovisno o funkcionalnosti koju obavljaju unutar programa, instrukcije asemblerskog jezika mogu se podijeliti u nekoliko skupina. Najrelevantniji su detaljno opisani u nastavku:
1. Upute za prijenos podataka
Ove upute vam omogućuju kopiranje podataka s jednog mjesta na drugo., bez mijenjanja njegovog sadržaja u izvoru. Oni su neophodni za premještanje informacija između registara, memorije i perifernih uređaja.
Neke od najčešćih uputa u ovoj skupini su:
- MOV: Kopira sadržaj jednog operanda u drugi. Na primjer,
MOV AX, BXKopiraj sadržaj BX u AX. - MOVS / MOVSB / MOVSW: Premješta nizove znakova s izvorne adrese (SI) na odredišnu adresu (DI), automatizirajući proces prijenosa.
- LODS / LODSB / LODSW: Učitava vrijednost s adrese koju pokazuje SI registar u akumulator (AL ili AX).
- PROČITAJTE: Učitava efektivnu adresu umjesto vrijednosti. Korisno za dobivanje adrese varijable ili strukture.
2. Upute za bateriju
Stog ima LIFO strukturu (zadnji ulazi, prvi izlazi). koristi se za privremeno pohranjivanje podataka, prosljeđivanje parametara ili spremanje konteksta izvršavanja.
- GURNUTI: Pohranjuje vrijednost na stog, smanjujući vrijednost SP pokazivača.
- POP: Dohvaća najnoviju vrijednost pohranjenu na stogu, povećavajući SP.
- GURNI HF / POPF: Oni pohranjuju i dohvaćaju stanje CPU zastavica na stogu.
3. Aritmetičke i logičke instrukcije
Omogućuju izvođenje izračuna i operacija na bitovima. Ove instrukcije su bitne za manipuliranje numeričkim podacima i donošenje odluka u tijeku programa.
Među najčešće korištenima nalazimo:
- DODAJ / POD: Zbrajanje i oduzimanje.
- MUL / IMUL: Binarno množenje.
- DIV / IDIV: Dijeljenje (cijeli broj ili s predznakom).
- I / ILI / XOR / NE: Bitovne logičke operacije.
- SHL / SHR / ROL / ROR: Pomicanje i rotacija bitova.
4. Upute za kontrolu protoka
Omogućuju vam promjenu redoslijeda izvršavanja programa, uvođenjem uvjetnih i bezuvjetnih skokova ili poziva drugih instrukcija.
- ŽMP: Bezuvjetno skače na drugu adresu u programu.
- POZOVI / POVRATI: Poziv potprograma i povratak.
- JE/JNE/JG/JL/JZ/JNZ: Uvjetni skokovi, izvršavaju se ako su ispunjeni određeni uvjeti (nakon usporedbe).
5. Ulazno/izlazne (I/O) instrukcije
Omogućuju procesoru komunikaciju s vanjskim uređajima. Ove instrukcije vam omogućuju čitanje i pisanje podataka iz/na (hardverske) portove.
- IN: Čita podatke s ulaznog porta.
- VAN: Šalje podatke na izlazni port.
6. Instrukcije s pomičnim zarezom
Mnogi CPU-i imaju matematičke koprocesore (ili posebne instrukcije) namijenjen radu s decimalnim brojevima (s pomičnim zarezom). Ove upute vam omogućuju izvođenje operacija kao što su:
- Zbrajanje, oduzimanje, množenje i dijeljenje realnih brojeva.
- Trigonometrijske operacije (sinus, kosinus, tangens).
- Logaritamske, eksponencijalne i korijenske operacije.
Ove upute obično su u skladu s IEEE standardom 754 za numeričku preciznost.
Načini adresiranja
Temeljni dio dizajna instrukcija je kako identificirati gdje se operandi nalaze. The načini adresiranja definirati kako CPU pristupa podacima.
1. Neposredno adresiranje
Podaci su uključeni izravno u upute. Brz je, ali ne dopušta promjenu vrijednosti bez promjene instrukcije.
MOV AX, 5
2. Izravno adresiranje
Memorijska adresa koja sadrži podatke je eksplicitno navedena.
MOV AX,
3. Neizravno adresiranje
Efektivna adresa se dobiva iz sadržaja registra. Vrlo fleksibilan i koristi se za strukture i povezane liste.
MOV AX,
4. Indeksirano adresiranje
Adresa se izračunava zbrajanjem baze i indeksa (na primjer, za prolazak kroz nizove). Koristite posebne registre kao što su SI, DI ili bazni + pomični registri.
MOV AX,
Formati instrukcija: različite vrste ovisno o arhitekturi
Struktura instrukcije može varirati ovisno o arhitekturi. Uobičajeni formati uključuju:
4-smjerni format
Sadrži dva operanda, lokaciju rezultata i adresu sljedeće instrukcije. Danas je u zapuštenom stanju zbog svoje složenosti.
3-smjerni format
Određuje dva operanda i odredišnu adresu. To je uobičajeno u modernim RISC arhitekturama.
2-smjerni format
Koristi izvorni i odredišni operand (odredište također može pružiti vrijednost). Popularno na x86 i drugim CISC arhitekturama.
Jednosmjerni format
Označen je samo jedan operand; drugi bi trebao biti akumulator. Uobičajeno u starijim procesorima i jednostavnim sustavima.
Format 0-adrese (baziran na stogu)
Operacije koriste stog za izvlačenje i pohranjivanje operanada i rezultata. Vrlo učinkovito za strojeve na baterije, kao što su neki programabilni kalkulatori.
Makro instrukcije i pseudo-opkodovi
Kako bi poboljšali produktivnost, mnogi monteri nude makroinstrukcije, koji proširuju jedan redak u nekoliko stvarnih instrukcija. Korisni su za izbjegavanje ponavljanja složenih uzoraka ili za stvaranje struktura visoke razine poput petlji ili uvjetnih struktura.
The pseudo-opkodovi To su instrukcije koje asembler interno prevodi u stvarni niz instrukcija. Na primjer, NOP (bez operacije) se može prevesti kao XCHG AX, AX na x86 procesoru.
asemblerske direktive
Direktive (nazivaju se i pseudo-operacije) nisu upute same po sebi. Koriste se za kontrolu procesa asembliranja, definiranje podataka, dijelova koda, makroa, uvjeta kompilacije itd.
Uobičajeni primjeri uključuju:
- .podaci / .kod: Oni označavaju odjeljak podataka ili koda.
- .org: Postavlja adresu s koje će započeti asembliranje.
- .jednakost: Definira simboličke konstante.
Slučajevi upotrebe asemblerskog jezika
Unatoč porastu programskih jezika visoke razine, Asemblera se i dalje smatra ključnom u nekoliko područja:
- Razvoj ugradbenih sustava i mikrokontrolera.
- Programiranje upravljačkih programa, bootloadera i BIOS-a.
- Ekstremna optimizacija u aplikacijama kao što su videoigre ili kriptografija.
- Obrnuti inženjering, otklanjanje pogrešaka i hakiranje niske razine.
Osim toga, obuka asemblerskog jezika je još uvijek zauzima važno mjesto u karijerama računalnih znanosti i elektroniku, jer pruža duboko razumijevanje načina rada procesora, načina pohranjivanja i manipuliranja podacima te načina izvršavanja instrukcija na binarnoj razini.
Razumijevanje svih vrsta asemblerskih instrukcija, njihove strukture, funkcionalnosti i načina adresiranja pruža solidnu osnovu za svakog programera koji želi istražiti programske jezike niske razine ili razumjeti kako se programski jezici visoke razine u konačnici prevode u strojni kod. Iako je njegova upotreba postala specifičnija, ostaje bitan alat u više kritičnih područja razvoja softvera i sustava.