- Asemblerio kalba savo instrukcijas tvarko pagal paskirtį: perkėlimą, skaičiavimą, srauto valdymą ir kita.
- Kiekviena instrukcija susideda iš opkodo ir operandų, kurių formatai skiriasi priklausomai nuo architektūros.
- Yra keli adresavimo būdai duomenims pasiekti, pavyzdžiui, tiesioginis, neatidėliotinas ir netiesioginis.
Asemblerio kalba buvo vienas iš pagrindinių programinės įrangos kūrimo ramsčių nuo pat skaičiavimo pradžios. Nors šiandien dominuoja aukšto lygio kalbos, asembleris išlieka plačiai naudojamas ir aktualus aplinkose, kuriose prioritetas teikiamas aparatinės įrangos valdymui, optimizavimui ar išteklių apribojimams.
Šiame straipsnyje mes išsamiai nagrinėsime asemblerio kalbos instrukcijų tipus, analizuosime jų struktūrą, paskirtį, adresavimo režimus ir kaip jos yra organizuotos skirtingose architektūrose. Taip pat rasite pavyzdžių, formatų ir išsamią apžvalgą, kuri leis jums visiškai suprasti šių instrukcijų, kurios labai glaudžiai sąveikauja su aparatine įranga, logiką.
Kas yra instrukcija asemblerio kalba?
Asemblerio instrukcija yra komanda, kurią centrinis procesorius gali tiesiogiai suprasti (kai asemblerio programa ją išverčia į mašininį kodą). Kiekviena instrukcija turi konkretų tikslą ir paprastai susideda iš mnemonikos, kuri vaizduoja operaciją, ir vieno ar kelių operandų , nurodančių, iš kur imami duomenys ir (arba) kur saugomi rezultatai.
Šios instrukcijos labai priklauso nuo procesoriaus architektūros, todėl kiekvienas procesoriaus tipas (nesvarbu, ar tai x86, ARM, MIPS ir kt.) turi savo instrukcijų rinkinį su tam tikra sintakse ir galimybėmis.
Instrukcijos struktūra
Instrukcijos paprastai susideda iš dviejų dalių:
- Operacijos kodas (opcode): Nurodo veiksmą, kurį reikia atlikti, pavyzdžiui, duomenų pridėjimas, perkėlimas, palyginimas ir kt.
Operandai teikia informaciją, reikalingą operacijai atlikti, ir gali būti saugomi registruose, atmintyje arba būti konstantos. Ne visoms instrukcijoms reikalingi operandai, o kai kuriais atvejais jie gali būti numanomi instrukcijoje arba saugomi iš anksto apibrėžtuose registruose.
Instrukcijų tipai asemblerio kalba
Priklausomai nuo funkcionalumo, kurį jie atlieka programoje, asemblerio kalbos instrukcijas galima suskirstyti į kelias grupes. Svarbiausi iš jų išsamiau aprašyti toliau:
1. Duomenų perdavimo instrukcijos
Šios instrukcijos leidžia kopijuoti duomenis iš vienos vietos į kitą nekeičiant jų turinio šaltinyje. Jos yra būtinos norint perkelti informaciją tarp registrų, atminties ir periferinių įrenginių.
Kai kurios dažniausiai pasitaikančios šios grupės instrukcijos yra šios:
- MOV: Kopijuoja vieno operando turinį į kitą. Pavyzdžiui,
MOV AX, BXNukopijuokite BX turinį į AX. - MOVS / MOVSB / MOVSW: Perkelia eilutes iš šaltinio adreso (SI) į paskirties adresą (DI), automatizuodamas perdavimo procesą.
- LODS / LODSB / LODSW: Įkelia reikšmę iš SI registro nurodyto adreso į akumuliatorių (AL arba AX).
- SKAITYTI: Įkelia efektyvų adresą, o ne reikšmę. Naudinga norint gauti kintamojo arba struktūros adresą.
2. Baterijos instrukcijos
Stekas yra LIFO (paskutinis įeina, pirmas išeina) struktūra , naudojama laikinai saugoti duomenis, perduoti parametrus arba išsaugoti vykdymo kontekstą.
- stumti: Saugo reikšmę stekoje, mažindama SP rodyklę.
- Pop: Nuskaito naujausią steke saugomą reikšmę, didindama SP.
- STUMTI / POPF: Jie saugo ir nuskaito procesoriaus vėliavėlių būseną stekoje.
3. Aritmetinės ir loginės instrukcijos
Jos leidžia atlikti skaičiavimus ir operacijas su bitais. Šios instrukcijos yra būtinos norint manipuliuoti skaitmeniniais duomenimis ir priimti sprendimus programos eigoje.
Tarp dažniausiai naudojamų randame:
- PRIDĖTI / PAPILDOMI: Sudėtis ir atimtis.
- MUL / IMUL: Dvejetainės daugybos.
- DIV / IDIV: Dalyba (sveikasis skaičius arba ženklas).
- IR / ARBA / XAR / NE: Bitų loginės operacijos.
- SHL / SHR / ROL / ROR: Bitų poslinkiai ir sukimai.
4. Srauto valdymo instrukcijos
Jie leidžia modifikuoti programos vykdymo seką , įvedant šuolius arba sąlyginius ir besąlyginius iškvietimus į kitas instrukcijas.
- JMP: Besąlygiškai peršoka į kitą programos adresą.
- SKAMBINTI / ATSISKAMBINTI: Iškviesti subrutinę programą ir grįžti.
- JE/JNE/JG/JL/JZ/JNZ: Sąlyginiai šuoliai, jie vykdomi, jei įvykdomos tam tikros sąlygos (po palyginimo).
5. Įvesties / išvesties (I / O) instrukcijos
Jos leidžia procesoriui ir išoriniams įrenginiams bendrauti. Šios instrukcijos leidžia skaityti ir rašyti duomenis į prievadus (aparatinę įrangą) ir iš jų.
- IN: Nuskaito duomenis iš įvesties prievado.
- OUT: Siunčia duomenis į išvesties prievadą.
6. Slankiojo kablelio instrukcijos
Daugelyje procesorių yra matematiniai koprocesoriai (arba specialios instrukcijos), skirti dirbti su dešimtainiais (slankiojo kablelio) skaičiais. Šios instrukcijos leidžia atlikti tokias operacijas kaip:
- Realiųjų skaičių sudėtis, atimtis, daugyba ir dalyba.
- Trigonometriniai veiksmai (sinusas, kosinusas, tangentas).
- Logaritminiai, eksponentiniai ir šaknies veiksmai.
Šios instrukcijos paprastai atitinka IEEE 754 skaitmeninio tikslumo standartą.
Adresavimo režimai
Esminė instrukcijų projektavimo dalis yra tai, kaip nustatoma operandų vieta. Adresavimo režimai apibrėžia, kaip CPU pasiekia duomenis.
1. Neatidėliotinas kreipimasis
Duomenys įtraukiami tiesiai į instrukciją. Tai greita, bet neleidžia keisti reikšmių nepakeitus instrukcijos.
MOV AX, 5
2. Tiesioginis adresavimas
Atminties adresas, kuriame saugomi duomenys, yra aiškiai nurodytas.
MOV AX,
3. Netiesioginis adresavimas
Efektyvus adresas gaunamas iš įrašo turinio. Labai lankstus ir naudojamas struktūroms bei susietiesiems sąrašams.
MOV AX,
4. Indeksuotas adresavimas
Adresas apskaičiuojamas sudedant bazinį ir indeksinį registrus (pavyzdžiui, norint peržiūrėti masyvus). Tam naudojami specialūs registrai, tokie kaip SI, DI arba baziniai + poslinkio registrai.
MOV AX,
Instrukcijų formatai: skirtingi tipai priklausomai nuo architektūros
Instrukcijos struktūra gali skirtis priklausomai nuo architektūros. Įprasti formatai:
4 krypčių formatas
Jame yra du operandai, rezultato vieta ir kitos instrukcijos adresas. Dėl savo sudėtingumo jis dabar yra pasenęs .
3 krypčių formatas
Jame nurodomi du operandai ir paskirties adresas. Tai įprasta šiuolaikinėse RISC architektūrose.
2 krypčių formatas
Naudokite šaltinio operandą ir paskirties operandą (paskirties operandas taip pat gali prisidėti prie reikšmės). Populiaru x86 ir kitose CISC architektūrose.
Vienpusis formatas
Nurodytas tik vienas operandas; kitas laikomas kaupikliu. Įprasta senesniuose procesoriuose ir paprastose sistemose.
0 adresų formatas (steko pagrindu)
Operacijos naudoja steką operandams ir rezultatams gauti ir saugoti. Labai efektyvu steką naudojančiose mašinose, tokiose kaip kai kurie programuojami skaičiuotuvai.
Makroinstrukcijos ir pseudo-opkodai
Siekdami pagerinti produktyvumą, daugelis asemblerių siūlo makro instrukcijas , kurios išplečia vieną eilutę į kelias faktines instrukcijas. Jos naudingos norint išvengti sudėtingų šablonų kartojimo arba kuriant aukšto lygio struktūras, tokias kaip ciklai ar sąlyginiai sakiniai.
Los pseudo-operaciniai kodai Tai instrukcijos, kurias asembleris viduje paverčia į realią instrukcijų seką. Pavyzdžiui, NOP (be operacijos) galima išversti kaip XCHG AX, AX ant x86 procesoriaus.
Montuotojo direktyvos
Direktyvos ( dar vadinamos pseudooperacijomis ) nėra instrukcijos griežtąja prasme. Jos skirtos valdyti surinkimo procesą, apibrėžti duomenis, kodo sekcijas, makrokomandas, kompiliavimo sąlygas ir kt.
Įprasti pavyzdžiai:
- .duomenys / .kodas: Jie nurodo duomenų arba kodo skyrių.
- .org: Nustato adresą, nuo kurio prasidės surinkimas.
- .equ: Apibrėžia simbolines konstantas.
Asemblerio kalbos naudojimo atvejai
Nepaisant aukšto lygio kalbų iškilimo, asemblerio kalba išlieka pagrindine keliose srityse:
- Įterptųjų sistemų ir mikrovaldiklių kūrimas.
- Tvarkyklių, įkrovos įkroviklių ir BIOS programavimas.
- Ekstremalus optimizavimas tokiose programose kaip vaizdo žaidimai ar kriptografija.
- Atvirkštinė inžinerija, derinimas ir žemo lygio įsilaužimas.
Be to, asemblerio kalbos mokymai vis dar užima svarbią vietą kompiuterių mokslo ir elektronikos studijose, nes suteikia gilų supratimą apie tai, kaip veikia procesorius, kaip saugomi ir tvarkomi duomenys, ir kaip instrukcijos vykdomos dvejetainiu lygmeniu.
Visų tipų surinkimo instrukcijų, jų struktūros, funkcionalumo ir adresavimo režimų supratimas suteikia tvirtą pagrindą bet kuriam programuotojui, norinčiam pasinerti į žemo lygio programavimą arba suprasti, kaip aukšto lygio kalbos galiausiai verčiamos į mašininį kodą. Nors jo naudojimas tapo konkretesnis, jis išlieka esminiu įrankiu daugelyje svarbių programinės įrangos ir sistemų kūrimo sričių.