- Assemblerkeel korraldab oma juhised eesmärgi järgi: edastus, arvutamine, voolu juhtimine ja palju muud.
- Iga käsk koosneb opkoodist ja operandidest, millel on arhitektuurist olenevalt erinevad vormingud.
- Andmetele juurdepääsuks on mitu adresseerimisviisi, näiteks kohene, otsene ja kaudne.
Assemblerkeel on olnud tarkvaraarenduse üks alustalasid arvutite tekkimisest peale. Kuigi tänapäeval domineerivad kõrgetasemelised programmeerimiskeeled, on assembler endiselt laialdaselt kasutatav ja asjakohane keskkondades, kus riistvara juhtimine, optimeerimine või ressursipiirangud on esmatähtsad.
Selles artiklis süveneme assemblerkeele käskude tüüpidesse, analüüsides nende struktuuri, eesmärki, adresseerimisrežiime ja seda, kuidas need on erinevates arhitektuurides korraldatud. Samuti leiate näiteid, vorminguid ja põhjaliku ülevaate, mis võimaldab teil täielikult mõista nende käskude taga olevat loogikat, mis toimivad riistvaraga väga tihedalt seotud.
Mis on assemblerkeeles käsk?
Assemblerkäsk on käsk, millest protsessor saab otse aru (kui assemblerprogramm on selle masinkoodiks tõlginud). Igal käsul on kindel eesmärk ja see koosneb tavaliselt mnemoonikast, mis esindab operatsiooni, ja ühest või mitmest operandist , mis näitavad, kust andmed võetakse ja/või kuhu tulemused salvestatakse.
Need juhised sõltuvad suuresti protsessori arhitektuurist, seega on igal protsessori tüübil (olgu see siis x86, ARM, MIPS jne) oma juhiste komplekt, millel on kindel süntaks ja võimalused.
Juhise struktuur
Juhised koosnevad tavaliselt kahest osast:
- Operatsioonikood (opkood): Näitab teostatavat toimingut, näiteks andmete lisamine, teisaldamine, võrdlemine jne.
Operandid annavad operatsiooni sooritamiseks vajaliku teabe ning neid saab salvestada registritesse, mällu või konstantidena. Mitte kõik käsud ei vaja operande ja mõnel juhul võivad need olla käsus kaudselt sisalduvad või salvestatud eelnevalt määratletud registritesse.
Assemblerkeele juhiste tüübid
Sõltuvalt funktsionaalsusest, mida nad programmis täidavad, saab assemblerkeele juhiseid jagada mitmeks rühmaks. Kõige asjakohasemad on üksikasjalikumalt kirjeldatud allpool:
1. Andmeedastuse juhised
Need käsud võimaldavad andmeid ühest kohast teise kopeerida ilma nende sisu allikal muutmata. Need on olulised teabe liigutamiseks registrite, mälu ja välisseadmete vahel.
Mõned selle grupi kõige levinumad juhised on järgmised:
- MOV: Kopeerib ühe operandi sisu teise. Näiteks
MOV AX, BXKopeeri BX sisu AX-i. - MOVS / MOVSB / MOVSW: Liigutab stringid lähteaadressilt (SI) sihtaadressilt (DI), automatiseerides edastusprotsessi.
- LODS / LODSB / LODSW: Laadib SI-registri poolt näidatud aadressilt väärtuse akumulaatorisse (AL või AX).
- LOE: Laadib väärtuse asemel efektiivse aadressi. Kasulik muutuja või struktuuri aadressi saamiseks.
2. Aku juhised
Pinu on LIFO (viimane sisse, esimene välja) struktuur, mida kasutatakse andmete ajutiseks salvestamiseks, parameetrite edastamiseks või täitmiskonteksti salvestamiseks.
- PUSH: Salvestab väärtuse pinumällu, vähendades SP-pointerit.
- POP: Tagastab pinu viimase salvestatud väärtuse, suurendades SP-d.
- LÜKKA / POPF: Nad salvestavad ja hangivad pinu protsessori lippude oleku.
3. Aritmeetilised ja loogilised juhised
Need võimaldavad bittidega arvutusi ja toiminguid teha. Need käsud on olulised numbriliste andmetega manipuleerimiseks ja programmi voos otsuste langetamiseks.
Kõige enamkasutatavate hulgast leiame:
- LISA / VÄLJA: Liitmine ja lahutamine.
- MUL / IMUL: Binaarsed korrutused.
- DIV / IDIV: Jagamine (täisarv või märgiga).
- JA / VÕI / XVÕI / EI: Bitipõhised loogilised tehted.
- SHL / SHR / ROL / ROR: Biti nihutamine ja pööramine.
4. Voolu juhtimise juhised
Need võimaldavad teil muuta programmi täitmisjärjestust , lisades hüppeid või tingimuslikke ja tingimusteta kõnesid teistele käskudele.
- JMP: Hüppab programmis tingimusteta teisele aadressile.
- HELISTA / TAGASIKELLUTA: Kutsuge alamrutiini ja naaske.
- JE/JNE/JG/JL/JZ/JNZ: Tingimuslikud hüpped, neid täidetakse teatud tingimuste täitmisel (pärast võrdlemist).
5. Sisend-/väljundkäsud (I/O)
Need võimaldavad protsessori ja väliste seadmete vahelist suhtlust. Need käsud võimaldavad andmeid portidesse (riistvarasse) lugeda ja sealt kirjutada.
- IN: Loeb andmeid sisendportist.
- OUT: Saadab andmed väljundporti.
6. Ujukomakäsud
Paljudel protsessoritel on matemaatilised kaasprotsessorid (või spetsiaalsed käsud), mis on pühendatud kümnendarvude (ujukomaarvude) töötlemisele. Need käsud võimaldavad selliseid toiminguid nagu:
- Reaalarvude liitmine, lahutamine, korrutamine ja jagamine.
- Trigonomeetrilised tehted (siinus, koosinus, tangens).
- Logaritmilised, eksponentsiaalsed ja juurtehted.
Need juhised vastavad numbrilise täpsuse osas tavaliselt IEEE 754 standardile.
Aadressirežiimid
Käskude disaini põhiosa on see, kuidas operandide asukohta tuvastatakse. Aadressirežiimid määravad, kuidas protsessor andmetele juurde pääseb.
1. Kohene tegelemine
Andmed on otse käsklusesse lisatud. See on kiire, kuid see ei võimalda väärtusi muuta ilma käsklust muutmata.
MOV AX, 5
2. Otsene adresseerimine
Andmeid sisaldav mäluaadress on selgesõnaliselt määratud.
MOV AX,
3. Kaudne adresseerimine
Efektiivne aadress saadakse kirje sisust. Väga paindlik ja kasutatakse struktuuride ja lingitud loendite puhul.
MOV AX,
4. Indekseeritud adresseerimine
Aadress arvutatakse baasi ja indeksi liitmise teel (näiteks massiivide läbimiseks). See kasutab spetsiaalseid registreid, näiteks SI, DI või baasi + nihke registreid.
MOV AX,
Juhiste vormingud: erinevad tüübid sõltuvalt arhitektuurist
Käsu struktuur võib arhitektuurist olenevalt erineda. Levinumad vormingud on järgmised:
4-suunaline formaat
See sisaldab kahte operandi, tulemuse asukohta ja järgmise käsu aadressi. Oma keerukuse tõttu on see nüüdseks aegunud .
3-suunaline formaat
See määrab kaks operandi ja sihtkoha aadressi. See on tänapäevastes RISC arhitektuurides tavaline.
2-suunaline formaat
Kasutage lähteoperandi ja sihtoperandi (sihtkoht võib samuti väärtust anda). Populaarne x86 ja teistes CISC arhitektuurides.
Ühesuunaline formaat
Määratud on ainult üks operand; teist eeldatakse akumulaatorina. Levinud vanemate protsessorite ja lihtsamate süsteemide puhul.
0-aadressi formaat (virnapõhine)
Toimingud kasutavad pinumälu operandide ja tulemuste toomiseks ja salvestamiseks. Väga tõhus pinupõhiste masinate, näiteks mõnede programmeeritavate kalkulaatorite puhul.
Makrokäsud ja pseudo-opkoodid
Tootlikkuse parandamiseks pakuvad paljud assemblerid makrokäsklusi , mis laiendavad ühe rea mitmeks tegelikuks käsuks. Need on kasulikud keerukate mustrite kordamise vältimiseks või kõrgetasemeliste struktuuride, näiteks tsüklite või tingimuslausete loomiseks.
osa pseudo-opkoodid Need on juhised, mille assembler tõlgib sisemiselt reaalseks juhiste jadaks. Näiteks NOP (ilma operatsioonita) saab tõlkida järgmiselt XCHG AX, AX x86 protsessoril.
Assembleri direktiivid
Direktiivid ( nimetatakse ka pseudooperatsioonideks ) ei ole ranges mõttes käsud. Nende eesmärk on juhtida assemblerprotsessi, määratleda andmeid, koodilõike, makrosid, kompileerimistingimusi jne.
Levinud näited hõlmavad järgmist:
- .andmed / .kood: Need tähistavad andmete või koodi sektsiooni.
- .org: Määrab aadressi, kust assamblee algab.
- .equ: Defineerib sümboolsed konstandid.
Assemblerkeele kasutusjuhud
Vaatamata kõrgetasemeliste keelte esiletõusule on assemblerkeel mitmes valdkonnas endiselt võtmetähtsusega:
- Manussüsteemide ja mikrokontrollerite arendamine.
- Draiverite, alglaadurite ja BIOS-i programmeerimine.
- Äärmuslik optimeerimine sellistes rakendustes nagu videomängud või krüptograafia.
- Pöördprojekteerimine, silumine ja madala taseme häkkimine.
Lisaks on assemblerkeele õpetamisel endiselt oluline koht arvutiteaduse ja elektroonika kraadiõppes, kuna see annab sügava arusaama protsessori toimimisest, andmete salvestamisest ja töötlemisest ning käskude täitmisest binaartasandil.
Igasuguste assambleejuhiste, nende struktuuri, funktsionaalsuse ja adresseerimisrežiimide mõistmine annab kindla aluse igale programmeerijale, kes soovib süveneda madala taseme programmeerimisse või mõista, kuidas kõrgetasemelised keeled lõpuks masinkoodiks tõlgitakse. Kuigi selle kasutamine on muutunud spetsiifilisemaks, on see endiselt oluline tööriist mitmes tarkvara- ja süsteemiarenduse kriitilises valdkonnas.