- Assembly-kieli järjestää käskynsä tarkoituksen mukaan: siirto, laskenta, virtauksen hallinta ja paljon muuta.
- Jokainen käsky koostuu operaatiokoodista ja operandeista, joiden muodot vaihtelevat arkkitehtuurin mukaan.
- Tiedon käyttämiseen on useita osoitustapoja, kuten välitön, suora ja epäsuora.
Assembly-kieli on ollut yksi ohjelmistokehityksen peruspilareista tietojenkäsittelyn alkuajoista lähtien. Vaikka korkean tason ohjelmointikielet hallitsevat nykyään alaa, assembler on edelleen laajalti käytetty ja merkityksellinen ympäristöissä, joissa laitteistonhallinta, optimointi tai resurssirajoitukset ovat etusijalla.
Tässä artikkelissa perehdymme erityyppisiin assembly-kielen käskyihin, analysoimme niiden rakennetta, tarkoitusta, osoitustiloja ja sitä, miten ne on järjestetty eri arkkitehtuureissa. Löydät myös esimerkkejä, formaatteja ja kattavan yleiskatsauksen, jonka avulla voit ymmärtää täysin näiden käskyjen taustalla olevan logiikan, jotka toimivat hyvin läheisesti laitteiston kanssa.
Mikä on käsky assembly-kielellä?
Assembly -käsky on komento, jonka CPU voi ymmärtää suoraan (kun assembler-ohjelma on kääntänyt sen konekielelle). Jokaisella käskyllä on tietty tarkoitus, ja se koostuu yleensä muistisääntöön perustuvasta operaatiosta ja yhdestä tai useammasta operandista , jotka osoittavat, mistä tiedot otetaan ja/tai minne tulokset tallennetaan.
Nämä ohjeet ovat erittäin riippuvaisia prosessorin arkkitehtuurista, joten jokaisella suorittimen tyypillä (olipa kyseessä sitten x86, ARM, MIPS jne.) on omat ohjeet, joilla on tietty syntaksi ja ominaisuudet.
Ohjeen rakenne
Ohjeet koostuvat yleensä kahdesta osasta:
- Operaatiokoodi (opcode): Osoittaa suoritettavan toiminnon, kuten tietojen lisääminen, siirtäminen, vertailu jne.
Operandit tarjoavat operaation suorittamiseen tarvittavat tiedot, ja ne voidaan tallentaa rekistereihin, muistiin tai ne voidaan käyttää vakioina. Kaikki käskyt eivät vaadi operandeja, ja joissakin tapauksissa ne voivat olla implisiittisesti käskyssä tai tallennettuna ennalta määriteltyihin rekistereihin.
Ohjeiden tyypit assembly-kielellä
Ohjelmassa suoritettavien toimintojen mukaan assembly-kielen ohjeet voidaan luokitella useisiin ryhmiin. Olennaisimmat on lueteltu alla:
1. Tiedonsiirto-ohjeet
Näiden ohjeiden avulla dataa voidaan kopioida paikasta toiseen muuttamatta sen sisältöä lähteessä. Ne ovat välttämättömiä tiedon siirtämiseksi rekistereiden, muistin ja oheislaitteiden välillä.
Joitakin yleisimpiä ohjeita tässä ryhmässä ovat:
- MOV: Kopioi yhden operandin sisällön toiseen. Esimerkiksi,
MOV AX, BXKopioi BX:n sisältö AX:ään. - MOVS / MOVSB / MOVSW: Siirtää merkkijonoja lähdeosoitteesta (SI) kohdeosoitteeseen (DI) automatisoiden siirtoprosessin.
- LODS / LODSB / LODSW: Lataa arvon SI-rekisterin osoittamasta osoitteesta akkumulaattoriin (AL tai AX).
- LUKEA: Lataa tehokkaan osoitteen arvon sijaan. Hyödyllinen muuttujan tai rakenteen osoitteen hakemiseen.
2. Akun ohjeet
Pino on LIFO-rakenne (last in, first out), jota käytetään datan väliaikaiseen tallentamiseen, parametrien välittämiseen tai suorituskontekstin tallentamiseen.
- TYÖNTÄÄ: Tallentaa arvon pinoon vähentäen SP-osoitinta.
- POP: Hakee pinoon tallennetun viimeisimmän arvon, kasvattaen SP:tä.
- TYÖNNÖS / POPF: Ne tallentavat ja hakevat pinossa olevien CPU-lippujen tilan.
3. Aritmeettiset ja loogiset ohjeet
Ne mahdollistavat laskelmien ja toimintojen suorittamisen biteillä. Nämä käskyt ovat välttämättömiä numeerisen datan käsittelyssä ja päätöksenteossa ohjelmakulussa.
Käytetyimpien joukosta löydämme:
- LISÄÄ / TILAA: Yhteen- ja vähennyslasku.
- MUL / IMUL: Binäärikertolaskut.
- DIV / IDIV: Jakolasku (kokonaisluku tai etumerkillä merkitty).
- JA / TAI / XTAI / EI: Bittikohtaiset loogiset operaatiot.
- SHL / SHR / ROL / ROR: Bittien siirtymät ja rotaatiot.
4. Virtauksen säätöohjeet
Niiden avulla voit muokata ohjelman suoritusjärjestystä lisäämällä hyppyjä tai ehdollisia ja ehdottomia kutsuja muihin käskyihin.
- JMP: Hyppää ehdoitta toiseen osoitteeseen ohjelmassa.
- SOITA / PALAUTA: Kutsu aliohjelmaa ja palaa.
- JE/JNE/JG/JL/JZ/JNZ: Ehdolliset hypyt, ne suoritetaan, jos tietyt ehdot täyttyvät (vertailun jälkeen).
5. Tulo-/lähtöohjeet (I/O)
Ne mahdollistavat prosessorin ja ulkoisten laitteiden välisen kommunikaation. Näiden käskyjen avulla tietoja voidaan lukea ja kirjoittaa porteista (laitteisto).
- IN: Lukee dataa tuloportista.
- OUT: Lähettää dataa lähtöporttiin.
6. Liukulukukäskyt
Monissa suorittimissa on matemaattisia apuprosessoreita (tai erityiskäskyjä), jotka on tarkoitettu desimaalilukujen (liukulukujen) käsittelyyn. Nämä käskyt mahdollistavat esimerkiksi seuraavat toiminnot:
- Reaalilukujen yhteen-, vähennys-, kerto- ja jakolaskut.
- Trigonometriset laskutoimitukset (sini, kosini, tangentti).
- Logaritminen, eksponentiaalinen ja juurilaskutoimitukset.
Nämä ohjeet ovat tyypillisesti IEEE 754 -standardin mukaisia numeerisen tarkkuuden osalta.
Osoitustilat
Käskyjen suunnittelun olennainen osa on operandien sijainnin tunnistaminen. Osoitustilat määrittelevät, miten CPU käyttää dataa.
1. Välitön puuttuminen
Tiedot sisältyvät suoraan käskyyn. Se on nopeaa, mutta se ei salli arvojen muokkaamista muuttamatta käskyä.
MOV AX, 5
2. Suora osoittaminen
Datan sisältävä muistiosoite on määritetty eksplisiittisesti.
MOV AX,
3. Epäsuora osoittaminen
Efektiivinen osoite saadaan tietueen sisällöstä. Hyvin joustava ja käytetään rakenteissa ja linkitetyissä listoissa.
MOV AX,
4. Indeksoitu osoitus
Osoite lasketaan laskemalla yhteen kantaluku ja indeksi (esimerkiksi taulukoiden läpikäymiseksi). Se käyttää erityisrekistereitä, kuten SI-, DI- tai kantaluku- ja offset-rekistereitä.
MOV AX,
Ohjemuotoja: erilaisia tyyppejä arkkitehtuurista riippuen
Käskyn rakenne voi vaihdella arkkitehtuurista riippuen. Yleisiä formaatteja ovat:
4-suuntainen muoto
Se sisältää kaksi operandia, tulospaikan ja seuraavan käskyn osoitteen. Se on nyt vanhentunut monimutkaisuutensa vuoksi.
3-suuntainen muoto
Se määrittää kaksi operandia ja kohdeosoitteen. Se on yleinen nykyaikaisissa RISC-arkkitehtuureissa.
2-suuntainen muoto
Käytä lähdeoperandia ja kohdeoperandia (myös kohdeoperandia voidaan käyttää arvon lisäämiseen). Suosittu x86- ja muissa CISC-arkkitehtuureissa.
1-suuntainen muoto
Vain yksi operandi on määritelty; toisen oletetaan olevan akkumulaattori. Yleinen vanhemmissa prosessoreissa ja yksinkertaisissa järjestelmissä.
0-osoitemuoto (pinopohjainen)
Toiminnot käyttävät pinoa operandin ja tulosten hakemiseen ja tallentamiseen. Erittäin tehokas pinopohjaisille koneille, kuten joillekin ohjelmoitaville laskimille.
Makro-ohjeet ja pseudo-opkoodit
Tuottavuuden parantamiseksi monet assemblerit tarjoavat makrokäskyjä , jotka laajentavat yhden rivin useiksi varsinaisiksi käskyiksi. Nämä ovat hyödyllisiä monimutkaisten kuvioiden toistamisen välttämiseksi tai korkean tason rakenteiden, kuten silmukoiden tai ehtolauseiden, luomiseksi.
Los pseudo-opkoodit Ne ovat ohjeita, jotka assembler kääntää sisäisesti todelliseksi ohjesarjaksi. Esimerkiksi, NOP (ei operaatiota) voidaan kääntää seuraavasti XCHG AX, AX x86-suorittimella.
Assembler-direktiivit
Direktiivit ( joita kutsutaan myös pseudo-operaatioiksi ) eivät ole ohjeita sanan varsinaisessa merkityksessä. Niiden tehtävänä on ohjata kokoonpanoprosessia, määritellä tietoja, koodin osia, makroja, käännösehtoja jne.
Yleisiä esimerkkejä ovat:
- .data / .code: Ne osoittavat data- tai koodiosan.
- .org: Asettaa osoitteen, josta kokoonpano aloitetaan.
- .equ: Määrittelee symboliset vakiot.
Assembly-kielen käyttötapaukset
Korkean tason kielten noususta huolimatta assembly-kieli on edelleen avainasemassa useilla alueilla:
- Sulautettujen järjestelmien ja mikrokontrollerien kehitys.
- Ohjainten, käynnistyslatainten ja BIOSin ohjelmointi.
- Äärimmäinen optimointi sovelluksissa, kuten videopeleissä tai kryptografiassa.
- Käänteinen suunnittelu, virheenkorjaus ja matalan tason hakkerointi.
Lisäksi assembly-kielen koulutuksella on edelleen tärkeä paikka tietojenkäsittelytieteen ja elektroniikan tutkinnoissa, sillä se tarjoaa syvällisen ymmärryksen prosessorin toiminnasta, datan tallentamisesta ja käsittelystä sekä käskyjen suorittamisesta binääritasolla.
Kaikenlaisten kokoonpano-ohjeiden, niiden rakenteen, toiminnallisuuden ja osoitusmoodien ymmärtäminen tarjoaa vankan pohjan kaikille ohjelmoijille, jotka haluavat perehtyä matalan tason ohjelmointiin tai ymmärtää, miten korkean tason kielet lopulta käännetään konekieleksi. Vaikka sen käyttö on tarkentunut, se on edelleen olennainen työkalu useilla ohjelmisto- ja järjestelmäkehityksen kriittisillä alueilla.