Asemblerio kalba - tai programavimo kalba, kuria galima tiesiogiai nurodyti kompiuteriui, ką daryti. Asemblerio kalba beveik visiškai panaši į kompiuteriui suprantamą mašininį kodą, tik vietoj skaičių joje naudojami žodžiai. Kompiuteris iš tikrųjų negali tiesiogiai suprasti asemblerio programos. Tačiau jis gali lengvai pakeisti programą į mašininį kodą, pakeisdamas programos žodžius skaičiais, kuriuos jie reiškia. Tai atliekanti programa vadinama asembleriu.
Asemblerio kalba parašytas programas paprastai sudaro instrukcijos - nedidelės užduotys, kurias kompiuteris atlieka vykdydamas programą. Jos vadinamos instrukcijomis, nes programuotojas jomis nurodo kompiuteriui, ką daryti. Kompiuterio dalis, kuri vykdo instrukcijas, yra procesorius.
Kompiuterio asemblerio kalba yra žemo lygio kalba, o tai reiškia, kad ja galima atlikti tik paprastas užduotis, kurias kompiuteris supranta tiesiogiai. Norint atlikti sudėtingesnes užduotis, reikia kompiuteriui nurodyti kiekvieną iš paprastų užduočių, kurios yra sudėtingos užduoties dalis. Pavyzdžiui, kompiuteris nesupranta, kaip ekrane atspausdinti sakinį. Vietoj to, asembleriu parašyta programa turi jam pasakyti, kaip atlikti visus mažus veiksmus, susijusius su sakinio spausdinimu.
Tokią surinkimo programą sudarytų daugybė instrukcijų, kurios kartu atliktų tai, kas žmogui atrodo labai paprasta ir paprasta. Todėl žmonėms sunku skaityti asemblerio programą. Priešingai, aukšto lygio programavimo kalba gali būti viena instrukcija, pavyzdžiui, PRINT "Sveikas, pasauli!", kuri nurodys kompiuteriui atlikti visas smulkias užduotis už jus.
Kaip asembleris veikia
Asembleris (assembly translator) paima tekstinę asemblerio programą su žodžiais—mnemonikais (pvz., MOV, ADD, JMP) ir operandais (registro pavadinimai, atminties adresai, konstantos)—ir konvertuoja kiekvieną mnemoniką į atitinkamą mašininį kodą (baituose užkoduotą operaciją). Gautas rezultatas gali būti objektinis failas arba galutinė vykdomoji programa, dažnai sujungta perkėlimo (linkerio) metu su kitais objektais ir bibliotekomis.
Instrukcijos, registrai ir atmintis
- Instrukcijos (mnemonikos): trumpi žodžiai, nurodantys operaciją (pvz., sudėtimą, perkėlimą ar šakojimą).
- Registrai: greita procesoriaus vidinė atmintis (pvz., RAX, EAX, AX x86 architektūroje; arba R0, R1 ARM), su kuria daugiausia dirba instrukcijos.
- Atmintis ir adresavimas: instrukcijos gali nurodyti duomenis laikyti registruose arba atmintyje; egzistuoja įvairūs adresavimo būdai (tiesioginis, netiesioginis, su offsetu ir kt.).
- Žymos (labels) ir šakos: leidžia sukti programos vykdymą į tam tikras vietas (pvz., ciklams, sąlyginiams perėjimams).
Asemblerio sintaksė, direktyvos ir makrokomandos
Asemblerio rinkinyje dažnai yra ne tik instrukcijos, bet ir direktyvos (pvz., .data, .text), kurios nurodo, kur laikyti duomenis arba kodą, ir makrokomandos, leidžiančios apibrėžti kartotinai naudojamus kodo blokus. Dauguma modernių assemblerių taip pat palaiko simbolinį vardinimą (etiketes), komentarus ir pseudo-instrukcijas, kurios palengvina rašymą ir skaitymą, bet vėliau išverčiamos į kelias tikras procesoriaus instrukcijas.
Asembleris ir instrukcijų rinkinių specifika
Asembleris yra glaudžiai susijęs su procesoriaus architektūra (ISA, instruction set architecture). Asemblerio programos, parašytos konkrečiai architektūrai (pvz., x86, ARM, MIPS), paprastai nėra perkeliamas į kitas architektūras be perrašymo, nes skirtingos architektūros turi skirtingas instrukcijas, registrus ir adresavimo metodus.
Privalumai ir trūkumai
- Privalumai:
- Didžiausias kontrolės lygis: galima optimizuoti greitį ir atminties naudojimą iki maksimumo.
- Tinka rašyti žemą lygį reikalaujančias dalis: įkrovos kodą (bootloader), įrenginių tvarkykles, realaus laiko ir įterptas sistemas.
- Naudinga sistemos inžinerijoje, saugumo tyrimuose, reverse engineering ir malware analizėje.
- Trūkumai:
- Skaityti ir rašyti sunku: didelė klaidų tikimybė ir mažesnis produktyvumas nei naudojant aukšto lygio kalbas.
- Nepakeliamumas tarp skirtingų procesorių architektūrų.
- Ilgiau vystyti ir sunkiau prižiūrėti didelius projektus.
Praktiniai panaudojimo atvejai
Asembleris dažnai naudojamas ten, kur reikalingas didžiausias našumas arba pilna aparatūros valdymo kontrolė:
- Įterptosios sistemos ir mikrokontroleriai (kur atmintis ir skaičiavimo galia riboti).
- Operacinių sistemų branduoliai ir sistemos palaikymo tvarkyklės.
- Įkrovos (boot) programos, kur nėra aukšto lygio kalbos palaikymo.
- Optimizuotiems, našumo kritiniams kodo fragmentams, kai kompiliatorius negali pasiekti norimų optimizacijų.
Asembleris prieš kompiliatorių
Kompiliatorius iš aukšto lygio kalbos (pvz., C, C++) automatiškai verčia aukšto lygio konstruktus į mašininį kodą, dažnai atliekant daug optimizacijų. Asembleris leidžia tiesiogiai rašyti tą mašininį kodą simboline forma. Šiuolaikinėje praktikoje daugeliu atvejų naudojama aukšto lygio kalba dėl produktyvumo, o asembleris taikomas tik ten, kur būtina arba naudinga.
Trumpas pavyzdys (iliustracija)
Tipinė asemblerio instrukcija gali atrodyti taip: MOV AX, 1 — tai reiškia „perkelk konstantą 1 į registrą AX“. Kitas pavyzdys: ADD AX, BX — prideda registro BX reikšmę prie registro AX. Realioje programoje šie eilutės supakuojamos kartu su žymomis, direktyvomis ir komentarais, o assembleris jas verčia į atitinkamus mašinius operacijos kodus (opcodes).
Išvados
Asemblerio kalba suteikia tiesioginę prieigą prie procesoriaus funkcijų ir leidžia rašyti maksimaliai efektyvų kodą, bet reikalauja gerų žinių apie aparatūrą ir didesnio darbo sąnaudų. Daugeliui programavimo užduočių patogiau naudoti aukšto lygio kalbas, tačiau asembleris išlieka svarbus įrankis programuotojams, dirbantiems su sisteminiu lygiu, įterptomis sistemomis ir optimizacijomis.