- Az assembly nyelv az utasításokat cél szerint rendszerezi: átvitel, számítás, folyamatvezérlés és egyebek.
- Minden utasítás egy opkódból és operandusokból áll, az architektúrától függően eltérő formátumokkal.
- Az adatokhoz való hozzáférésnek számos címzési módja van, például az azonnali, a közvetlen és a közvetett címzés.
Az assembly nyelv a szoftverfejlesztés egyik alapvető pillére a számítástechnika kezdete óta. Bár a magas szintű nyelvek uralják a mai világot, az assembler továbbra is széles körben használt és releváns olyan környezetekben, ahol a hardvervezérlés, az optimalizálás vagy az erőforrás-korlátozások prioritást élveznek.
Ebben a cikkben az assembly nyelvű utasítások típusait vizsgáljuk meg, elemezve azok felépítését, célját, címzési módjait és azt, hogy hogyan szerveződnek a különböző architektúrák között. Példákat, formátumokat és egy átfogó áttekintést is találsz, amely lehetővé teszi, hogy teljes mértékben megértsd ezen utasítások mögött rejlő logikát, amelyek nagyon szorosan együttműködnek a hardverrel.
Mi az az utasítás assembly nyelven?
Az assembly utasítás egy olyan parancs, amelyet a CPU közvetlenül megért (miután egy assembler program gépi kóddá alakította). Minden utasításnak meghatározott célja van, és általában egy mnemonikból áll , amely a műveletet reprezentálja, valamint egy vagy több operandusból , amelyek jelzik, hogy hová veszik az adatokat és/vagy hol tárolják az eredményeket.
Ezek az utasítások nagymértékben függenek a processzor architektúrájától, így minden CPU-típusnak (legyen az x86, ARM, MIPS, többek között) megvan a saját utasításkészlete, adott szintaxissal és képességekkel.
Egy utasítás szerkezete
Az utasítások általában két részből állnak:
- Műveleti kód (opkód): A végrehajtandó műveletet jelzi, például adatok hozzáadása, mozgatása, összehasonlítása stb.
Az operandusok biztosítják a művelet végrehajtásához szükséges információkat, és regiszterekben, memóriában vagy konstansokként tárolhatók. Nem minden utasítás igényel operandusokat, és bizonyos esetekben ezek implicit módon szerepelhetnek az utasításban, vagy előre definiált regiszterekben tárolhatók.
Az assembly nyelvű utasítások típusai
Attól függően, hogy milyen funkciókat látnak el egy programban, az assembly nyelvű utasítások több csoportba sorolhatók. A legrelevánsabbakat az alábbiakban részletezzük:
1. Adatátviteli utasítások
Ezek az utasítások lehetővé teszik az adatok másolását egyik helyről a másikra anélkül, hogy a forrásnál módosítanák a tartalmukat. Alapvető fontosságúak az információk regiszterek, memória és perifériák közötti mozgatásához.
A csoport leggyakoribb utasításai a következők:
- MOV: Egy operandus tartalmát átmásolja egy másikba. Például,
MOV AX, BXMásold a BX tartalmát az AX-be. - MOVS / MOVSB / MOVSW: Karakterláncokat mozgat egy forráscímről (SI) egy célcímre (DI), automatizálva az átviteli folyamatot.
- LODS / LODSB / LODSW: Betölt egy értéket az SI regiszter által jelzett címről az akkumulátorba (AL vagy AX).
- OLVAS: Egy effektív címet tölt be az érték helyett. Hasznos egy változó vagy struktúra címének lekéréséhez.
2. Akkumulátorra vonatkozó utasítások
A verem egy LIFO (utoljára be, először ki) struktúra, amelyet adatok ideiglenes tárolására, paraméterek átadására vagy a végrehajtási kontextus mentésére használnak.
- NYOM: Egy értéket tárol a veremben, csökkentve az SP mutatót.
- POP: Lekéri a veremben tárolt legfrissebb értéket, SP-vel növelve.
- TOLÁS / NYOMÁS: Tárolják és lekérik a veremben lévő CPU-jelzők állapotát.
3. Számtani és logikai utasítások
Lehetővé teszik a biteken végzett számítások és műveletek végrehajtását. Ezek az utasítások elengedhetetlenek a numerikus adatok kezeléséhez és a programfolyamatban történő döntéshozatalhoz.
A leggyakrabban használtak között találjuk:
- HOZZÁADÁS / FELÁR: Összeadás és kivonás.
- MUL / IMUL: Bináris szorzások.
- DIV / IDIV: Osztás (egész szám vagy előjeles).
- ÉS / VAGY / XOR / NEM: Bitenkénti logikai műveletek.
- SHL / SHR / ROL / ROR: Biteltolások és forgatások.
4. Áramlásszabályozási utasítások
Lehetővé teszik a program végrehajtási sorrendjének módosítását , ugrások vagy feltételes és feltétel nélküli hívások bevezetését más utasításokra.
- JMP: Feltétel nélkül egy másik címre ugrik a programban.
- HÍVÁS / VISSZAJELENTÉS: Hívjon meg egy alprogramot, majd térjen vissza.
- JE/JNE/JG/JL/JZ/JNZ: Feltételes ugrások, akkor kerülnek végrehajtásra, ha bizonyos feltételek teljesülnek (összehasonlítás után).
5. Bemeneti/Kimeneti (I/O) utasítások
Ezek teszik lehetővé a processzor és a külső eszközök közötti kommunikációt. Ezek az utasítások teszik lehetővé az adatok olvasását és írását a portokról (hardver).
- IN: Adatokat olvas egy bemeneti portról.
- KI: Adatokat küld egy kimeneti portra.
6. Lebegőpontos utasítások
Sok CPU rendelkezik matematikai koprocesszorokkal (vagy speciális utasításokkal), amelyek decimális (lebegőpontos) számokkal dolgoznak. Ezek az utasítások olyan műveleteket tesznek lehetővé, mint:
- Valós számok összeadása, kivonása, szorzása és osztása.
- Trigonometrikus műveletek (szinusz, koszinusz, tangens).
- Logaritmikus, exponenciális és gyökműveletek.
Ezek az utasítások jellemzően megfelelnek az IEEE 754 szabványnak a numerikus pontosság tekintetében.
Címzési módok
Az utasítástervezés alapvető része az operandusok helyének azonosítása. A címzési módok határozzák meg, hogy a CPU hogyan fér hozzá az adatokhoz.
1. Azonnali címzés
Az adatok közvetlenül az utasításban szerepelnek. Gyors, de nem teszi lehetővé az értékek módosítását az utasítás megváltoztatása nélkül.
MOV AX, 5
2. Közvetlen címzés
Az adatokat tartalmazó memóriacím explicit módon meg van adva.
MOV AX,
3. Közvetett címzés
A tényleges címet a rekord tartalmából nyerjük ki. Nagyon rugalmas, és struktúrákhoz és láncolt listákhoz használják.
MOV AX,
4. Indexelt címzés
A cím kiszámítása egy alap és egy index összeadásával történik (például tömbök bejárásához). Speciális regisztereket használ, például SI, DI vagy alap + eltolás regisztereket.
MOV AX,
Utasításformátumok: az architektúrától függően különböző típusok
Egy utasítás szerkezete az architektúrától függően változhat. Gyakori formátumok a következők:
4-utas formátum
Két operandust, egy eredményhelyet és a következő utasítás címét tartalmazza. Összetettsége miatt ma már elavult .
3-utas formátum
Két operandust és egy célcímet határoz meg. Gyakori a modern RISC architektúrákban.
2-utas formátum
Használjon egy forrás- és egy céloperandust (a céloperandust is hozzáadhatja). Népszerű x86 és más CISC architektúrákon.
1-irányú formátum
Csak egy operandust adunk meg; a másikat akkumulátornak tekintjük. Gyakori régebbi processzorokban és egyszerű rendszerekben.
0-cím formátum (verem alapú)
A műveletek a veremtárolót használják az operandusok és eredmények lekérésére és tárolására. Nagyon hatékony veremtároló alapú gépeknél, például egyes programozható számológépeknél.
Makró utasítások és pszeudo-opkódok
A termelékenység növelése érdekében számos assembler makró utasításokat kínál , amelyek egyetlen sort több tényleges utasítássá bővítenek. Ezek hasznosak az összetett minták ismétlődésének elkerülésére, vagy magas szintű struktúrák, például ciklusok vagy feltételes utasítások létrehozására.
sok pszeudo-opkódok Ezek olyan utasítások, amelyeket az assembler belsőleg lefordít egy valódi utasítássorozattá. Például, NOP (nincs művelet) fordítható le úgy, mint XCHG AX, AX x86-os CPU-n.
Assembler utasítások
A direktívák ( más néven pszeudo-műveletek ) nem szigorú értelemben vett utasítások. Az assembly folyamat vezérlésére, adatok, kódrészletek, makrók, fordítási feltételek stb. definiálására szolgálnak.
Gyakori példák a következők:
- .data / .code: Az adat- vagy kódrészletet jelzik.
- .org: Beállítja azt a címet, ahonnan az összeszerelés indul.
- .equ: Szimbolikus konstansokat definiál.
Assembly nyelvi használati esetek
A magas szintű nyelvek térnyerése ellenére az assembly nyelv továbbra is kulcsfontosságú számos területen:
- Beágyazott rendszerek és mikrovezérlők fejlesztése.
- Illesztőprogramok, rendszerbetöltők és BIOS programozása.
- Extrém optimalizálás olyan alkalmazásokban, mint a videojátékok vagy a kriptográfia.
- Visszafejtés, hibakeresés és alacsony szintű hackelés.
Továbbá az assembly nyelv oktatása továbbra is fontos helyet foglal el a számítástechnikai és elektronikai diplomákon, mivel mélyreható ismereteket nyújt a processzor működéséről, az adatok tárolásáról és kezeléséről, valamint az utasítások bináris szintű végrehajtásáról.
Az összes összeszerelési utasítás típusának, azok felépítésének, funkcionalitásának és címzési módjának megértése szilárd alapot nyújt minden programozó számára, aki mélyebben szeretne elmerülni az alacsony szintű programozásban, vagy megérteni, hogyan fordíthatók le végül a magas szintű nyelvek gépi kóddá. Bár a használata specifikusabbá vált, továbbra is alapvető eszköz a szoftver- és rendszerfejlesztés számos kritikus területén.