- Asemblerski jezik organizuje svoje instrukcije po namjeni: prenos, izračunavanje, kontrola protoka i drugo.
- Svaka instrukcija se sastoji od opkoda i operanada, s različitim formatima ovisno o arhitekturi.
- Postoji nekoliko načina adresiranja za pristup podacima, kao što su neposredni, direktni i indirektni.
Asemblerski jezik je bio jedan od osnovnih stubova razvoja softvera od samog početka računarstva. Iako danas na sceni dominiraju programski jezici visokog nivoa, asembler ostaje široko korišten i relevantan u okruženjima gdje su kontrola hardvera, optimizacija ili ograničenja resursa prioritet.
U ovom članku ćemo se pozabaviti vrstama instrukcija asemblerskog jezika, analizirajući njihovu strukturu, svrhu, načine adresiranja i kako su organizirane u različitim arhitekturama. Također ćete pronaći primjere, formate i sveobuhvatan pregled koji će vam omogućiti da u potpunosti razumijete logiku koja stoji iza ovih instrukcija, koje vrlo blisko djeluju s hardverom.
Šta je instrukcija u asemblerskom jeziku?
Asemblerska instrukcija je naredba koju CPU može direktno razumjeti (nakon što je asemblerski program prevede u mašinski kod). Svaka instrukcija ima specifičnu svrhu i obično se sastoji od mnemonika koji predstavlja operaciju i jednog ili više operanada koji pokazuju odakle se podaci uzimaju i/ili gdje se rezultati pohranjuju.
Ove instrukcije uveliko zavise od arhitekture procesora, tako da svaki tip CPU-a (bilo da je to x86, ARM, MIPS, između ostalih) ima svoj vlastiti skup instrukcija sa određenom sintaksom i mogućnostima.
Struktura instrukcije
Upute se obično sastoje od dva dijela:
- Operacijski kod (opcode): Označava radnju koja treba da se izvrši, kao što su dodavanje, premještanje podataka, poređenje itd.
Operandi pružaju informacije potrebne za izvršavanje operacije i mogu se pohraniti u registre, memoriju ili biti konstante. Nisu svim instrukcijama potrebni operandi, a u nekim slučajevima, oni mogu biti implicitni u instrukciji ili pohranjeni u unaprijed definiranim registrima.
Vrste instrukcija u asemblerskom jeziku
U zavisnosti od funkcionalnosti koju obavljaju unutar programa, instrukcije asemblerskog jezika mogu se klasifikovati u nekoliko grupa. Najrelevantniji su detaljno opisani u nastavku:
1. Upute za prijenos podataka
Ove instrukcije omogućavaju kopiranje podataka s jedne lokacije na drugu bez mijenjanja njihovog sadržaja na izvoru. One su neophodne za premještanje informacija između registara, memorije i perifernih uređaja.
Neke od najčešćih instrukcija u ovoj grupi su:
- MOV: Kopira sadržaj jednog operanda u drugi. Na primjer,
MOV AX, BXKopiraj sadržaj BX u AX. - MOVS / MOVSB / MOVSW: Premješta stringove sa izvorne adrese (SI) na odredišnu adresu (DI), automatizirajući proces prijenosa.
- LODS / LODSB / LODSW: Učitava vrijednost sa adrese koju pokazuje SI registar u akumulator (AL ili AX).
- PROČITAJTE: Učitava efektivnu adresu umjesto vrijednosti. Korisno za dobijanje adrese varijable ili strukture.
2. Upute za bateriju
Stek je LIFO (zadnji uđe, prvi izađe) struktura koja se koristi za privremeno pohranjivanje podataka, prosljeđivanje parametara ili spremanje konteksta izvršavanja.
- GURANJE: Pohranjuje vrijednost na stek, smanjujući vrijednost SP pokazivača.
- POP: Dohvaća najnoviju vrijednost pohranjenu na steku, povećavajući SP.
- GURNI / POPF: Oni pohranjuju i preuzimaju stanje CPU zastavica na steku.
3. Aritmetičke i logičke instrukcije
Omogućavaju izvođenje proračuna i operacija na bitovima. Ove instrukcije su neophodne za manipulisanje numeričkim podacima i donošenje odluka u toku programa.
Među najčešće korištenim nalazimo:
- DODAJ / POD: Sabiranje i oduzimanje.
- MUL / IMUL: Binarno množenje.
- DIV / IDIV: Dijeljenje (cijeli broj ili sa predznakom).
- I / ILI / XOR / NE: Bitovne logičke operacije.
- SHL / SHR / ROL / ROR: Pomjeranja i rotacije bitova.
4. Instrukcije za kontrolu toka
Oni vam omogućavaju da modificirate redoslijed izvršavanja programa , uvodeći skokove ili uvjetne i bezuvjetne pozive drugih instrukcija.
- JMP: Bezuvjetno skače na drugu adresu u programu.
- POZOVI / POVRATI: Poziv potprograma i povratak.
- JE/JNE/JG/JL/JZ/JNZ: Uslovni skokovi, izvršavaju se ako su ispunjeni određeni uslovi (nakon poređenja).
5. Ulazno/izlazne (I/O) instrukcije
One omogućavaju komunikaciju između procesora i eksternih uređaja. Ove instrukcije omogućavaju čitanje i pisanje podataka na/iz portova (hardver).
- u: Čita podatke sa ulaznog porta.
- OUT: Šalje podatke na izlazni port.
6. Instrukcije s pomičnim zarezom
Mnogi CPU-i imaju matematičke koprocesore (ili posebne instrukcije) namijenjene radu s decimalnim (brojevima s pomičnim zarezom) brojevima. Ove instrukcije omogućavaju operacije kao što su:
- Sabiranje, oduzimanje, množenje i dijeljenje realnih brojeva.
- Trigonometrijske operacije (sinus, kosinus, tangenta).
- Logaritamske, eksponencijalne i operacije s korijenima.
Ove instrukcije su obično u skladu sa standardom IEEE 754 za numeričku preciznost.
Načini adresiranja
Fundamentalni dio dizajna instrukcija je način na koji se identificira lokacija operanada. Načini adresiranja definiraju kako CPU pristupa podacima.
1. Neposredno adresiranje
Podaci su direktno uključeni u instrukciju. Brzo je, ali ne dozvoljava modifikaciju vrijednosti bez promjene instrukcije.
MOV AX, 5
2. Direktno adresiranje
Memorijska adresa koja sadrži podatke je eksplicitno navedena.
MOV AX,
3. Indirektno adresiranje
Efektivna adresa se dobija iz sadržaja zapisa. Vrlo fleksibilna i koristi se za strukture i povezane liste.
MOV AX,
4. Indeksirano adresiranje
Adresa se izračunava dodavanjem baze i indeksa (na primjer, za kretanje kroz nizove). Koristi posebne registre kao što su SI, DI ili registri baze + pomaka.
MOV AX,
Formati instrukcija: različiti tipovi u zavisnosti od arhitekture
Struktura instrukcije može varirati ovisno o arhitekturi. Uobičajeni formati uključuju:
4-smjerni format
Uključuje dva operanda, lokaciju rezultata i adresu sljedeće instrukcije. Sada je zastario zbog svoje složenosti.
3-smjerni format
Specificira dva operanda i odredišnu adresu. Uobičajen je u modernim RISC arhitekturama.
2-smjerni format
Koristite izvorni operand i odredišni operand (odredišni operand također može doprinijeti vrijednosti). Popularno na x86 i drugim CISC arhitekturama.
Jednosmjerni format
Samo jedan operand je specificiran; drugi se pretpostavlja da je akumulator. Uobičajeno kod starijih procesora i jednostavnih sistema.
Format 0-adrese (baziran na steku)
Operacije koriste stek za dohvaćanje i pohranjivanje operanada i rezultata. Vrlo efikasno za mašine zasnovane na steku, kao što su neki programabilni kalkulatori.
Makro instrukcije i pseudo-opkodovi
Da bi se poboljšala produktivnost, mnogi asembleri nude makro instrukcije , koje proširuju jednu liniju u nekoliko stvarnih instrukcija. One su korisne za izbjegavanje ponavljanja složenih obrazaca ili za kreiranje struktura visokog nivoa kao što su petlje ili uslovne naredbe.
u 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 ( također zvane pseudo-operacije ) nisu instrukcije u strogom smislu. One služe za kontrolu procesa asembliranja, definiranje podataka, dijelova koda, makroa, uvjeta kompajliranja itd.
Uobičajeni primjeri uključuju:
- .podaci / .kod: Oni označavaju dio podataka ili koda.
- .org: Postavlja adresu s koje će započeti asembliranje.
- .equ: Definiše simboličke konstante.
Slučajevi upotrebe asemblerskog jezika
Uprkos porastu programskih jezika visokog nivoa, asemblerski jezik ostaje ključan u nekoliko oblasti:
- Razvoj ugradbenih sistema i mikrokontrolera.
- Programiranje drajvera, bootloadera i BIOS-a.
- Ekstremna optimizacija u aplikacijama kao što su videoigre ili kriptografija.
- Obrnuti inženjering, debuggiranje i hakovanje niskog nivoa.
Nadalje, obuka iz asemblerskog jezika i dalje zauzima važno mjesto u studijima računarstva i elektronike, jer pruža duboko razumijevanje načina rada procesora, načina pohranjivanja i manipulisanja podacima i načina izvršavanja instrukcija na binarnom nivou.
Razumijevanje svih vrsta asemblerskih instrukcija, njihove strukture, funkcionalnosti i načina adresiranja pruža solidnu osnovu za svakog programera koji želi da se udubi u programiranje niskog nivoa ili da shvati kako se jezici visokog nivoa na kraju prevode u mašinski kod. Iako je njegova upotreba postala specifičnija, on ostaje bitan alat u više kritičnih područja razvoja softvera i sistema.