itthon / Levélszemét / Absztrakt: Terv: Előszó. Összeállítás nyelve és utasítási szerkezete. Az exe fájl szerkezete (szemantikus elemzés). Assembly nyelvi parancsok (előadás) Táblázat parancsok assembly nyelven

Absztrakt: Terv: Előszó. Összeállítás nyelve és utasítási szerkezete. Az exe fájl szerkezete (szemantikus elemzés). Assembly nyelvi parancsok (előadás) Táblázat parancsok assembly nyelven

Assembly nyelvi utasításszerkezet A gépi utasítások szintjén történő programozás az a minimális szint, amelyen a számítógépes programozás lehetséges. A gépi utasítások rendszerének elegendőnek kell lennie a szükséges műveletek végrehajtásához a gép hardverének utasításokkal. Minden gépi utasítás két részből áll: egy műveleti részből, amely meghatározza a „mit tegyünk”, és egy operandusból, amely meghatározza a feldolgozó objektumokat, vagyis a „mit kell tenni”. A mikroprocesszor gépi utasítása, Assembly nyelven írva, egysoros, a következő formában: címke utasítás/irányító operandus(ok) ; megjegyzések A címkét, a parancsot/direktívát és az operandust legalább egy szóköz vagy tabulátor karakter választja el. Az utasítás operandusokat vessző választja el.

Az assembly nyelvi utasítás felépítése Az assembly nyelvi utasítás megmondja a fordítónak, hogy a mikroprocesszornak milyen műveletet kell végrehajtania. Az összeállítási direktívák a program szövegében megadott paraméterek, amelyek befolyásolják az összeállítási folyamatot vagy a kimeneti fájl tulajdonságait. Az operandus megadja az adatok kezdeti értékét (az adatszegmensben), vagy az utasítás által végrehajtandó elemeket (a kódszegmensben). Egy utasításnak lehet egy vagy két operandusa, vagy nem is. Az operandusok számát implicit módon az utasításkód adja meg. Ha a parancsot vagy az utasítást a következő sorban kell folytatni, akkor a fordított perjel karakter kerül felhasználásra: "" . Alapértelmezés szerint az assembler nem tesz különbséget a nagy- és kisbetűk között a parancsokban és direktívákban. Irányelv és parancs példák Szám db 1 ; Név, direktíva, egy operandus mov eax, 0 ; Parancs, két operandus

Az azonosítók érvényes karaktersorozatok, amelyek a változónevek és címkenevek kijelölésére szolgálnak. Az azonosító egy vagy több alábbi karakterből állhat: a latin ábécé összes betűje; számok 0-tól 9-ig; speciális karakterek: _, @, $, ? . A címke első karaktereként egy pont használható. A fenntartott assembler nevek (direktívák, operátorok, parancsnevek) nem használhatók azonosítóként. Az azonosító első karakterének betűnek vagy speciális karakternek kell lennie. Az azonosító maximális hossza 255 karakter, de a fordító elfogadja az első 32 karaktert, a többit figyelmen kívül hagyja. Minden olyan címkének, amely olyan sorba íródott, amely nem tartalmaz assembler direktívát, kettősponttal ":" kell végződnie. A címkének, a parancsnak (direktívának) és az operandusnak nem kell a karakterlánc egyetlen helyén sem kezdődnie. A program jobb olvashatósága érdekében ajánlatos ezeket egy oszlopba írni.

Címkék Az assembler direktívát nem tartalmazó sorokra írt összes címkének kettősponttal ":" kell végződnie. A címkének, a parancsnak (direktívának) és az operandusnak nem kell a karakterlánc egyetlen helyén sem kezdődnie. A program jobb olvashatósága érdekében ajánlatos ezeket egy oszlopba írni.

Megjegyzések A megjegyzések használata egy programban javítja a program áttekinthetőségét, különösen akkor, ha egy utasításkészlet célja nem egyértelmű. A megjegyzések a forrásmodul bármely sorában pontosvesszővel (;) kezdődnek. Minden karakter a "; A sor végére a megjegyzések következnek. A megjegyzés bármilyen nyomtatható karaktert tartalmazhat, beleértve a szóközt is. A megjegyzés átívelheti a teljes sort, vagy követheti az ugyanabban a sorban lévő parancsot.

Az assembly nyelvi program felépítése Az assembly nyelvi program több részből, úgynevezett modulokból állhat, amelyek mindegyike egy vagy több adat-, verem- és kódszegmenst definiálhat. Minden teljes assembly nyelvű programnak tartalmaznia kell egy fő- vagy főmodult, amelyből a végrehajtása kezdődik. Egy modul tartalmazhat programot, adatokat és veremszegmenseket, amelyeket a megfelelő direktívákkal deklarálnak.

Memóriamodellek A szegmensek deklarálása előtt meg kell adnia a memóriamodellt egy direktíva segítségével. MODEL módosító memóriamodell, hívási_konvenció, OS_típus, verem_paraméter Alapvető összeállítási nyelvi memóriamodellek: Memóriamodell Kódcímzés Adatcímzés Operációs rendszer Kód- és adatbeillesztés TINY MS-DOS KÖZELÉBEN Érvényes KIS MS-DOS KÖZELÉBEN, Windows Nem KÖZÉPES MS-DOS KÖZELÉB, Windows nem KOMPAKT KÖZEL TÁVOLI MS-DOS, Windows nincs NAGY TÁVOLI MS-DOS, Windows nincs HATALMAS TÁVOLI MS-DOS, Windows nincs Windows 2000 KÖZELÉBEN, Windows XP, Windows Érvényes FLAT NT KÖZEL,

Memóriamodellek Az apró modell csak 16 bites MS-DOS alkalmazásokban működik. Ebben a modellben minden adat és kód egy fizikai szegmensben található. A programfájl mérete ebben az esetben nem haladja meg a 64 KB-ot. A kis modell egy kódszegmenst és egy adatszegmenst támogat. Az adatok és a kód ennek a modellnek a használatakor a közeli (közeli) címzést jelenti. A médiummodell több kódszegmenst és egy adatszegmenst támogat, a kódszegmensek összes hivatkozását alapértelmezés szerint távolinak (távolinak), az adatszegmensben lévő hivatkozásokat pedig közelnek (közelnek) tekintik. A kompakt modell több olyan adatszegmenst támogat, amelyek távoli adatcímzést (távoli) és egy kódszegmenst használnak, amelyek közeli adatcímzést (közeli) használnak. A nagy modell több kódszegmenst és több adatszegmenst is támogat. Alapértelmezés szerint az összes kód- és adathivatkozás messze van. A hatalmas modell szinte egyenértékű a nagy memóriás modellel.

Memóriamodellek A lapos modell nem szegmentált programkonfigurációt feltételez, és csak 32 bites operációs rendszereken használatos. Ez a modell hasonlít az apró modellhez, mivel az adatok és a kód ugyanabban a 32 bites szegmensben találhatók. A direktíva előtti lapos modell programjának kidolgozása. lakásmodellnek el kell helyeznie az egyik direktívát: . 386, . 486, . 586 ill. 686. A processzorválasztó direktíva megválasztása határozza meg a programok írásakor elérhető parancsok halmazát. A processzorválasztási direktíva utáni p betű védett üzemmódot jelent. Az adat- és kódcímzés közel van, minden cím és mutató 32 bites.

memória modellek. MODEL módosító memória_modell, hívási_konvenció, OS_típus, verem_paraméter A módosító paraméter a szegmenstípusok meghatározására szolgál, és a következő értékeket veheti fel: use 16 (a kiválasztott modell szegmensei 16 bitesként kerülnek felhasználásra) use 32 (a kiválasztott modell szegmensei használatosak 32 bitesként). A calling_convention paraméter annak meghatározására szolgál, hogy a paraméterek hogyan kerülnek átadásra, amikor egy eljárást más nyelvekről hívnak meg, beleértve a nyelveket is. magas szint(C++, Pascal). A paraméter a következő értékeket veheti fel: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

memória modellek. MODEL módosító memória_modell, calling_convention, OS_type, stack_parameter Az OS_type paraméter alapértelmezés szerint OS_DOS, és be van kapcsolva Ebben a pillanatban ez az egyetlen támogatott érték ehhez a paraméterhez. A stack_param paraméter beállítása: NEARSTACK (az SS regiszter egyenlő a DS-szel, az adatok és a verem régiók ugyanabban a fizikai szegmensben találhatók) FARSTACK (az SS regiszter nem egyenlő a DS-szel, az adatok és a verem régiók különböző fizikai szegmensekben találhatók). Az alapértelmezés a NEARSTACK.

Példa a "semmit csináló" programra. 686 P. MODELL LAKÁS, STDCALL. ADAT. KÓD START: RET END START RET - mikroprocesszor parancs. Ez biztosítja a program helyes leállítását. A program többi része a fordító működéséhez kapcsolódik. . 686 P - A Pentium 6 (Pentium II) védett módú parancsai megengedettek. Ez a direktíva kiválasztja a támogatott assembler utasításkészletet a processzormodell megadásával. . MODEL FLAT, stdcall - lapos memória modell. Ezt a memóriamodellt a Windows operációs rendszer használja. Az stdcall a konvenciót hívó eljárás.

Példa a "semmit csináló" programra. 686 P. MODELL LAKÁS, STDCALL. ADAT. KÓD INDÍTÁSA: RET END START . DATA - adatokat tartalmazó programszegmens. Ez a program nem használja a veremet, ezért szegmentál. A STACK hiányzik. . CODE - a program egy szegmense, amely tartalmazza a kódot. START - címke. END START - a program vége és egy üzenet a fordítónak, hogy a programot a START címkéről kell elindítani. Minden programnak tartalmaznia kell egy END direktívát, amely kijelöli a program forráskódjának végét. Az END direktívát követő összes sort figyelmen kívül hagyja.Az END direktíva utáni címke közli a fordítóval annak a fő modulnak a nevét, amelytől a program végrehajtása kezdődik. Ha a program egy modult tartalmaz, akkor az END direktíva utáni címke elhagyható.

Assembly nyelvi fordítók A fordító olyan program vagy hardver, amely az egyik programozási nyelven bemutatott programot a célnyelvi programmá, úgynevezett objektumkódmá alakítja. A gépi utasítások mnemonikájának támogatása mellett minden fordítónak megvannak a saját direktívái és makrói, amelyek gyakran semmi mással nem kompatibilisek. Az assembly nyelvi fordítók fő típusai a következők: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - egy szabadon terjesztett többmenetes assembler, amelyet Tomasz Gryshtar (lengyel) írt, NASM (Netwide Assembler) - a Az Intel x architektúra 86 ingyenes assemblerjét Simon Tatham és Julian Hall készítette, és jelenleg a Source egy kis fejlesztőcsapata fejleszti. Kohó. háló.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Programfordítás a Microsoft Visual Studio 2005-ben 1) Hozzon létre egy projektet a Fájl->Új->Projekt kiválasztásával menü és"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В !} további beállítások projekt varázslót az „Üres projekt” beállításához.

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="(!LANG:Programfordítás a Microsoft Visual Studio 2005-ben 2) A projektfában (View->Solution Explorer) adja hozzá"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

A program fordítása Microsoft Visual Studio 2005-ben 3) Válassza ki a Code C++ fájltípust, de adja meg a nevet a kiterjesztéssel. asm:

A program fordítása a Microsoft Visual Studio 2005-ben 5) Állítsa be a fordító beállításait. Válassza ki a jobb gombbal a projektfájl menüben Egyéni felépítési szabályok…

A program fordítása a Microsoft Visual Studio 2005-ben, és a megjelenő ablakban válassza a Microsoft Macro Assembler lehetőséget.

A program fordítása a Microsoft Visual Studio 2005-ben Ellenőrizze a hello fájl jobb gombjával. asm a projektfából a Tulajdonságok menüből, és állítsa be az Általános->Eszköz: Microsoft Macro Assembler beállítást.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Programfordítás a Microsoft Visual Studio 2005-ben 6) Fordítsa le a fájlt a Build->Build hello.prj kiválasztásával ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programozás OS Windows alatt A Windows operációs rendszer programozása API-függvények (Application Program Interface, azaz szoftveralkalmazási felület) használatán alapul. Számuk eléri a 2000-et. A Windows programja nagyrészt ilyen hívásokból áll. Az operációs rendszer külső eszközeivel és erőforrásaival való minden interakció általában az ilyen funkciókon keresztül történik. Műtőszoba Windows rendszer lapos memória modellt használ. Bármely memóriahely címét egy 32 bites regiszter tartalma határozza meg. A Windowshoz 3 féle programstruktúra létezik: dialógus (a főablak egy párbeszéd), konzolos vagy ablak nélküli struktúra, klasszikus struktúra (ablak, keret).

Windows API-függvények hívása A súgófájlban bármely API-függvény a függvény_név típusaként jelenik meg (FA 1, FA 2, FA 3) Típus – visszatérési érték típusa; FAX – a formális argumentumok listája sorrendben, például int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ez a funkció egy ablakot jelenít meg egy üzenettel és egy kilépés gomb(oka)t. A paraméterek jelentése: h. Wnd - annak az ablaknak a fogantyúja, amelyben az üzenetablak megjelenik, lp. Szöveg – az ablakban megjelenő szöveg, lp. Felirat - szöveg az ablak címében, u. Típus - ablak típusa, különösen a kilépési gombok számát adhatja meg.

Windows API függvények hívása az Üzenetben. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Szinte az összes API függvényparaméter valójában 32 bites egész szám: a HWND egy 32 bites egész szám, az LPCTSTR egy 32 bites karakterlánc-mutató, az UINT egy 32 bites egész szám. Az "A" utótagot gyakran hozzáadják a függvények nevéhez, hogy a függvények újabb verzióira ugorjanak.

Windows API függvények hívása az Üzenetben. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); A MASM használatakor @N N karaktert kell hozzáadnia a név végéhez – ez az a bájtok száma, amelyet az átadott argumentumok a veremben foglalnak el. A Win 32 API-függvényeknél ez a szám az n-szeres argumentumok számaként definiálható 4-szer (bájt minden argumentumban): N=4*n. Egy függvény meghívásához az assembler CALL utasítását kell használni. Ebben az esetben a függvény összes argumentuma a veremen (PUSH parancs) keresztül kerül átadásra. Az érvelés átadási iránya: BALRA JOBBRA - ALUL FEL. Az u argumentum először kerül a verembe. típus. A megadott függvény hívása így fog kinézni: HÍVÁS Üzenet. doboz. [e-mail védett]

Windows API függvények hívása az Üzenetben. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Bármely API függvény végrehajtásának eredménye általában egy egész szám, amelyet az EAX regiszterben ad vissza. Az OFFSET direktíva egy "szegmenseltolás" vagy magas szintű nyelvhasználattal egy "mutató" egy karakterlánc elejére. Az EQU direktíva, mint a #define C-ben, egy állandót határoz meg. Az EXTERN direktíva közli a fordítóval, hogy egy függvény vagy azonosító a modulon kívüli.

Példa a "Helló mindenkinek!" . 686 P. MODELL LAKÁS, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Az első programom", 0 STR 2 DB "Helló mindenkinek!", 0 HW DD ? EXTERN üzenet. doboz. [e-mail védett]: KÖZEL. KÓD START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Üzenet. doboz. [e-mail védett] RET END START START

Az INVOKE direktíva A MASM nyelvi fordító a függvényhívás egyszerűsítését is lehetővé teszi egy makróeszköz segítségével - az INVOKE direktíva: INVOKE függvény, paraméter1, paraméter2, ... Nem kell @16-ot hozzáadni a függvényhíváshoz; a paraméterek pontosan a függvényleírásban megadott sorrendben vannak felírva. A fordító makrók paramétereket tolnak a verembe. az INVOKE direktíva használatához rendelkeznie kell a PROTO direktívát használó függvény prototípusának leírásával a következő formában: Üzenet. doboz. A PROTO: DWORD, : DWORD

Témakör 2.5 A processzorprogramozás alapjai

A program hosszának növekedésével egyre nehezebb megjegyezni a különböző műveletek kódjait. A mnemonika nyújt némi segítséget ebben a tekintetben.

A szimbolikus utasításkódoló nyelvet ún szerelő.

Assembly nyelv egy olyan nyelv, amelyben minden utasítás pontosan egy gépi utasításnak felel meg.

Szerelés program konvertálása assembly nyelvről, azaz program gépi nyelven történő elkészítése a műveletek szimbolikus neveinek gépi kódokkal, a szimbolikus címek abszolút vagy relatív számokkal való helyettesítésével, valamint könyvtári programok beépítése és szimbolikus utasítássorozatok generálása meghatározott paraméterek megadásával. mikroutasításokban. Ezt a programot általában ROM-ba helyezik, vagy valamilyen külső adathordozóról beírják a RAM-ba.

Az Assembly nyelvnek számos jellemzője van, amelyek megkülönböztetik a magas szintű nyelvektől:

1. Ez egy-egy megfeleltetés az assembly nyelvi utasítások és a gépi utasítások között.

2. Az assembly nyelvű programozó hozzáfér a célgépen található összes objektumhoz és parancshoz.

A géporientált nyelvek programozási alapjainak megértése hasznos:



A PC-architektúra jobb megértése és a számítógépek jobb használata;

Alkalmazott problémák megoldására szolgáló programok algoritmusainak racionálisabb struktúráinak kidolgozása;

Lehetőség a .exe és .com kiterjesztésű, bármely magas szintű nyelvről lefordított futtatható programok megtekintésére és javítására a forrásprogramok elvesztése esetén (a DEBUG program debuggerbe való meghívásával és a megjelenítésük assembly nyelven történő visszafordításával );

A legkritikusabb feladatok megoldására szolgáló programok összeállítása (a gépi nyelven összeállított program általában hatékonyabb - 30-60 százalékkal rövidebb és gyorsabb, mint a magas szintű nyelvekből fordítás eredményeként kapott programok)

A főprogramban lévő eljárások külön töredékként történő megvalósításához abban az esetben, ha nem valósíthatók meg sem a használt magas szintű nyelven, sem az operációs rendszer szolgáltatási eljárásait használva.

Egy assembly nyelvű program csak az azonos családba tartozó számítógépeken futhat, míg egy magas szintű nyelven írt program potenciálisan különböző gépeken futhat.

Az assembly nyelv ábécéje ASCII karakterekből áll.

A számok csak egész számok. Megkülönböztetni:

B betűvel végződő bináris számok;

D-vel végződő decimális számok;

N betűvel végződő hexadecimális számok.

RAM, regiszterek, adatábrázolás

Egy bizonyos MP-sorozathoz egyedi programozási nyelvet használnak - assembly nyelvet.

Az Assembly nyelv egy köztes helyet foglal el a gépi kódok és a magas szintű nyelvek között. Ezen a nyelven egyszerűbb a programozás. Egy assembly nyelvű program racionálisabban használja ki egy adott gép (pontosabban MP) képességeit, mint egy magas szintű nyelvű program (ami egyszerűbb a programozónak, mint az assemblernek). Megvizsgáljuk a géporientált nyelvek programozásának alapelveit, példaként az MP KR580VM80 összeállítási nyelvét használva. A nyelven történő programozáshoz általános technikát használnak. A programok rögzítésének speciális technikái a cél MP architektúrájához és parancsrendszeri jellemzőihez kapcsolódnak.

MP KR580VM80 alapú mikroprocesszoros rendszer szoftvermodellje

Az MPS programmodellje az 1. ábra szerint

MP portok memória

S Z AC P C

1. kép

A programozó szemszögéből a KR580VM80 MP a következő, program által elérhető regiszterekkel rendelkezik.

DE– 8 bites akkumulátor regiszter. Ez az MP fő nyilvántartása. Az ALU-ban végrehajtott bármely művelet magában foglalja a feldolgozandó operandusok egyikének az akkumulátorba helyezését. Az ALU-ban végzett művelet eredménye is általában A-ban tárolódik.

B, C, D, E, H, L– 8 bites általános célú regiszterek (RON). MP belső memória. Úgy tervezték, hogy tárolja a feldolgozott információkat, valamint a művelet eredményeit. A 16 bites szavak feldolgozása során a regiszterekből BC, DE, HL párok jönnek létre, és a kettős regiszter az első betű - B, D, H. A regiszterpárban az első regiszter a legmagasabb. Az adatok tárolására és a RAM cellák 16 bites címeinek tárolására egyaránt használt H, L regiszterek speciális tulajdonsággal rendelkeznek.

FL– flag regiszter (feature register) 8 bites regiszter, amely az MP-ben aritmetikai és logikai műveletek végrehajtásának eredményének öt jellemzőjét tárolja. FL formátum a kép szerint

C bit (CY - carry) - átvitel, 1-re állítva, ha a bájt magas sorrendjéből átvitel történt az aritmetikai műveletek végrehajtásakor.

P bit (paritás) - paritás, 1-re van állítva, ha az eredmény bitjeiben páros az egységek száma.

Az AC bit egy kiegészítő átvitel, amelyet arra terveztek, hogy az eredmény alsó tetradjából származó átviteli értéket tárolja.

Z bit (nulla) - állítsa 1-re, ha a művelet eredménye 0.

Az S (előjel) bit 1-re van állítva, ha az eredmény negatív, és 0-ra, ha az eredmény pozitív.

SP-- a veremmutató, egy 16 bites regiszter, annak a memóriahelynek a címének tárolására szolgál, ahová a verembe utoljára beírt bájtot írták.

RS– programszámláló (programszámláló), 16 bites regiszter, amely a következő végrehajtható utasítás címének tárolására szolgál. A programszámláló tartalma automatikusan 1-gyel növekszik közvetlenül a következő utasításbyte lekérése után.

A 0000H - 07FF cím kezdeti memóriaterületén egy vezérlőprogram és demo programok találhatók. Ez a ROM terület.

0800 - 0AFF - címterület a vizsgált műsorok rögzítéséhez. (RAM).

0В00 - 0ВВ0 - címterület adatrögzítéshez. (RAM).

A 0BB0 a verem kezdőcíme. (RAM).

A verem a RAM egy speciálisan szervezett területe, amelyet adatok vagy címek ideiglenes tárolására terveztek. A verembe utoljára betolt szám az első, amelyik kiugrik a veremből. A veremmutató az utolsó veremhely címét tárolja, ahol az információkat tárolták. Egy szubrutin meghívásakor a főprogram visszatérési címe automatikusan eltárolódik a veremben. Általános szabály, hogy minden szubrutin elején a végrehajtásában részt vevő összes regiszter tartalma a veremben tárolódik, az alprogram végén pedig visszaállításra kerül a veremből.

Assembly nyelvi adatformátum és parancsstruktúra

A Memory MP KR580VM80 egy 8 bites szavakból álló tömb, amelyet bájtoknak neveznek, és minden bájtnak saját 16 bites címe van, amely meghatározza a memóriacellák sorrendjében elfoglalt helyét. Az MP 65536 bájt memóriát tud megcímezni, amely ROM-ot és RAM-ot is tartalmazhat.

Adatformátum

Az adatok a memóriában 8 bites szavakként tárolódnak:

D7 D6 D5 D4 D3 D2 D1 D0

A legkisebb jelentőségű bit a 0, a legjelentősebb bit a 7. bit.

A parancsot a formátum jellemzi, vagyis a számára lefoglalt bitek száma, amelyek bájtonként vannak felosztva bizonyos funkcionális mezőkre.

Parancs formátum

Az MP KR580VM80 parancsok egy, két vagy három bájtos formátumúak. A többbájtos utasításokat a szomszédos PL-ekben kell elhelyezni. A parancs formátuma a végrehajtott művelet sajátosságaitól függ.

A parancs első bájtja a mnemonikus formában írt műveleti kódot tartalmazza.

Meghatározza a parancs formátumát és azokat a műveleteket, amelyeket az MP-nek végre kell hajtania az adatokon a végrehajtása során, valamint a címzés módját, valamint információkat tartalmazhat az adatok helyéről is.

A második és harmadik bájt tartalmazhat kezelendő adatokat, vagy címeket, amelyek jelzik az adatok helyét. Azokat az adatokat, amelyeken a műveleteket végrehajtják, operandusoknak nevezzük.

Egybájtos parancsformátum a 2. ábra szerint

4. ábra

Az assembly nyelvi utasításokban az opcode egy rövidített formája az angol szavak írásának - egy mnemonikus jelölés. A mnemonika (a görög mnemonikus szóból - a memorizálás művészete) megkönnyíti a parancsok emlékezését azok funkcionális céljának megfelelően.

A végrehajtás előtt a forrásprogramot egy fordítóprogrammal, úgynevezett assemblerrel lefordítják a kódkombinációk nyelvére - gépi nyelvre, ebben a formában elhelyezik az MP memóriájában, majd a parancs végrehajtása során használják.


Megszólítási módszerek

Minden operandus kódot (bemeneti és kimeneti) el kell helyezni valahol. Az MP belső regisztereiben lehetnek (a legkényelmesebb és leggyorsabb lehetőség). A rendszermemóriában találhatók (a leggyakoribb lehetőség). Végül az I / O eszközökben lehetnek (a legritkább eset). Az operandusok helyét az utasításkód határozza meg. Különféle módszerek léteznek, amelyekkel az utasításkód meghatározhatja, hogy honnan vegye a bemeneti operandust és hová tegye a kimeneti operandust. Ezeket a módszereket címzési módszereknek nevezzük.

Az MP KR580VM80 esetében a következő címzési módszerek állnak rendelkezésre:

Azonnali;

Regisztráció;

közvetett;

Kazal.

Azonnali A címzés feltételezi, hogy az operandus (bemenet) közvetlenül az utasításkód után van a memóriában. Az operandus általában egy konstans, amelyet el kell küldeni valahova, hozzá kell adni valamihez stb. Az adatokat a parancs második vagy második és harmadik bájtja tartalmazza, az alacsony adatbájt a második, a magas adatbájt a harmadik parancsbájtban.

Egyenes (más néven abszolút) címzés feltételezi, hogy az operandus (bemenet vagy kimenet) azon a címen található a memóriában, amelynek kódja közvetlenül az utasításkód után található a programban. Három bájtos parancsokban használatos.

Regisztráció A címzés feltételezi, hogy az operandus (bemenet vagy kimenet) a belső MP regiszterben van. Egybájtos parancsokban használatos

Közvetett Az (implicit) címzés feltételezi, hogy az MP belső regisztere nem maga az operandus, hanem a memóriában lévő címe.

Kazal A címzés feltételezi, hogy a parancs nem tartalmaz címet. Memóriacellák címzése a 16 bites SP regiszter (stack pointer) tartalmával.

Parancsrendszer

Az MP parancsrendszer azon elemi műveletek teljes listája, amelyeket az MP képes végrehajtani. Az ezekkel a parancsokkal vezérelt MP végrehajtja egyszerű lépéseket, mint például az elemi aritmetikai és logikai műveletek, adatátvitel, két érték összehasonlítása stb. A parancsok száma MP KR580VM80 - 78 (beleértve a 244 módosítást).

A következő parancscsoportok vannak:

Adatátvitel;

Számtan;

Összerakós játékaik;

Ugrás parancsok;

Parancsok a bemenethez-kimenethez, a vezérléshez és a veremmel való munkához.


Parancsok leírásánál és programok írásánál használt szimbólumok és rövidítések

Szimbólum Csökkentés
CÍM 16 bites cím
ADAT 8 bites adat
ADATOK 16 16 bites adat
KIKÖTŐ 8 bites I/O cím (I/O eszközök)
BYTE 2 Második parancsbájt
Bájt 3 Harmadik parancsbájt
R, R1, R2 Az egyik regiszter: A, B, C, D, E, H, L
RP Az egyik lajstrompár: B - egy repülőgéppárt állít be; D - beállít egy pár DE; H - egy HL-párt határoz meg
RH A pár első regisztrációja
RL A pár második regisztere
Λ Logikai szorzás
V Boole-összeadás
Modulo két kiegészítés
M Memóriacella, amelynek címe meghatározza a HL regiszterpár tartalmát, azaz M = (HL)

Assembly nyelvi parancsok (előadás)

ELŐADÁSTERV

1. A műveletek fő csoportjai.

Pentium.

1. A műveletek fő csoportjai

A mikroprocesszorok utasításokat hajtanak végre, amelyek a következő fő műveletcsoportokat valósítják meg:

továbbítási műveletek,

aritmetikai műveletek,

logikai műveletek,

műszakos műveletek,

összehasonlító és tesztelési műveletek,

bit műveletek,

Programmenedzsment műveletek;

Processzor vezérlési műveletek.

2. Processzorparancsok mnemokódjai Pentium

A parancsok leírásánál általában azok mnemonikus jelöléseit (mnemonikus kódjait) használjuk, amelyek Assembly nyelven történő programozáskor a parancs megadására szolgálnak. Az Assembler különböző verzióinál egyes parancsok mnemonikus kódjai eltérhetnek. Például egy szubrutin meghívására szolgáló parancshoz a mnemonikus kódot használjákHÍVÁS vagy JSR ("Ugorj szubrutin”). A mikroprocesszorok fő típusaihoz tartozó legtöbb parancs mnemonikus kódja azonban megegyezik vagy kissé eltér, mivel ezek a megfelelő angol szavak rövidítései, amelyek meghatározzák a végrehajtandó műveletet. Fontolja meg a processzorokhoz elfogadott parancsmnemonikat Pentium.

Előre irányuló parancsok. Ennek a csoportnak a fő parancsa a parancsMOV , amely adatátvitelt biztosít két regiszter között vagy egy regiszter és egy memóriacella között. Egyes mikroprocesszorok átvitelt valósítanak meg két memóriacella között, valamint több regiszter tartalmának csoportos átvitelét a memóriából. Például a 68-as család mikroprocesszorai Motorola xxx hajtsa végre a parancsotMOZOG , amely biztosítja az átvitelt egyik memóriacellából a másikba, és a parancsMOVEM , amely egy adott regiszterkészlet (maximum 16 regiszter) tartalmát a memóriába írja vagy a memóriából tölti be. CsapatXCHG két processzorregiszter vagy egy regiszter és egy memóriacella tartalmának kölcsönös cseréjét végzi.

Parancsok bevitele BAN BEN és kimenet KI megvalósítani az adatfeldolgozói regiszterből külső eszközre történő adatátvitelt vagy külső eszközről a regiszterbe történő adatvételt. Ezek a parancsok megadják annak az interfészeszköznek (I/O port) a számát, amelyen keresztül adatátvitel történik. Vegye figyelembe, hogy sok mikroprocesszornak nincs külön utasítása a hozzáféréshez külső eszközök. Ebben az esetben az adatok bevitele és kiadása a rendszerben a parancs segítségével történikMOV , amely megadja a szükséges interfész eszköz címét. Így egy külső eszköz memóriacellaként van megcímezve, a címtérben pedig egy meghatározott szakaszt foglalnak le, amelyben a rendszerhez kapcsolt interfész eszközök (portok) címei találhatók.

Parancsok aritmetikai műveletekhez. Ebben a csoportban a fő parancsok az összeadás, kivonás, szorzás és osztás, amelyeknek számos opciója van. Hozzáadás parancsok HOZZÁAD és kivonás ALATTI végezze el a megfelelő műveleteketckét regiszterrel, egy regiszterrel és egy memóriahellyel rendelkezik, vagy egy közvetlen operandust használ. Csapatok HIRDETÉS C , SB B az attribútum értékének figyelembevételével végezze el az összeadást és kivonástC, beállítva az átvitel kialakítása során az előző művelet végrehajtásának folyamatában. Ezen parancsok segítségével valósul meg az operandusok szekvenciális összeadása, amelyek számjegyeinek száma meghaladja a processzor kapacitását. Csapat NEG megváltoztatja az operandus előjelét, kettős komplementerré alakítva azt.

Előjeles számokkal (parancsokkal) végezhetők szorzási és osztási műveletekén MUL, én DIV ) vagy aláíratlan (parancsok MUL, DIV ). A művelet eredménye a regiszterben található. Szorzáskor (parancsokMUL , IMUL ) kétszámjegyű eredményt ad, amely két regisztert használ a befogadáshoz. Osztáskor (parancsokDIV , IDIV ) osztalékként egy kétjegyű operandust használunk, amelyet két regiszterbe helyezünk, és ennek eredményeként a hányadost és a maradékot két regiszterbe írjuk.

Logikai parancsok . Szinte minden mikroprocesszor végez logikai ÉS, VAGY, kizárólagos VAGY műveleteket, amelyeket parancsok segítségével hajt végre az azonos nevű operandusbiteken. ÉS, VAGY, x VAGY . A műveleteket két regiszter, egy regiszter és egy memóriahely tartalmával, vagy azonnali operandussal hajtjuk végre. Csapat NEM Megfordítja az operandus minden bitjének értékét.

Shift parancsok. A mikroprocesszorok a megcímzett operandusok aritmetikai, logikai és ciklikus eltolását végzik egy vagy több bittel. Az eltolni kívánt operandus lehet regiszterben vagy memóriahelyen, és a shift bitek számát az utasításban foglalt azonnali operandus segítségével, vagy a megadott regiszter tartalma határozza meg. Az átadási jel általában részt vesz a váltás végrehajtásábanCaz állapotnyilvántartásban (SR vagy ZÁSZLÓK), amely a regiszterből vagy a memóriahelyből kihúzott operandus utolsó bitjét tartalmazza.

Összehasonlítási és tesztelési parancsok . Az operandusok összehasonlítása általában az utasítással történikCMP , amely elvégzi az operandusok kivonását a jellemzők értékeinek beállításával N, Z, V, C az állapotregiszterben az eredmény szerint. Ebben az esetben a kivonás eredménye nem kerül mentésre, és az operandusok értékei nem változnak. A kapott jellemző értékek utólagos elemzése lehetővé teszi a relatív érték meghatározását (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Egyes mikroprocesszorok tesztparancsot hajtanak végre TST , amely az összehasonlítási utasítás egyetlen operandusos változata. Amikor ez a parancs végrehajtódik, a jelek beállnak N, Z a címzett operandus előjele és értéke (egyenlő vagy nem nulla) szerint.

Bit kezelési utasítások . Ezek a parancsok állítják be az attribútum értékétCaz állapotregiszterben a tesztelt bit értékének megfelelőenbn a címzett operandusban. Egyes mikroprocesszorokban a tesztelés eredménye szerint egy előjelet állítanak beZ. Tesztbit számanvagy a parancsban megadott regiszter tartalma, vagy egy azonnali operandus állítja be.

Ennek a csoportnak a parancsai különböző opciókat valósítanak meg a tesztelt bit megváltoztatására BT ennek a bitnek az értékét változatlanul tartja.Parancs B T S a tesztelés után beállítja az értéket bn=1, és a parancs B T C - jelentése bn=0.Parancs B T C megfordítja a bn bit értékét a tesztelés után.

Programkezelési műveletek. A program vezérléséhez nagyszámú parancsot használnak, amelyek között szerepel:

- feltétel nélküli vezérlésátviteli parancsok;

- feltételes ugrási parancsok;

- parancsok programciklusok szervezéséhez;

- megszakítási parancsok;

- funkcióváltási parancsok.

Az irányítás feltétel nélküli átadását a parancs hajtja végreJMP , amely betöltődik a programszámlálóbaPCúj tartalom, amely a következő végrehajtandó parancs címe. Ez a cím vagy közvetlenül a parancsban van megadvaJMP (közvetlen cím), vagy az aktuális tartalom összegeként számítvaPCés a parancsban megadott eltolás, ami egy előjeles szám (relatív címzés). MertPCtartalmazza a program következő parancsának címét, majd az utolsó metódus beállítja az átmenet címét, a következő címhez képest adott számú bájttal eltolva. Ha az eltolás pozitív, akkor a program következő parancsaira való áttérés történik, ha az eltolás negatív, akkor az előzőekre.

Az alprogramot a parancs használatával a vezérlés feltétel nélküli átadásával is meghívjákHÍVÁS (vagy JSR ). Ebben az esetben azonban a betöltés előttPC Az új tartalom, amely az alprogram első utasításának címét adja meg, annak aktuális értékét (a következő utasítás címét) el kell menteni, hogy az alprogram végrehajtása után a főprogramba (vagy a előző szubrutin szubrutinok beágyazásakor). A feltételes ugrási utasítások (program ágak) betöltődnekPCúj tartalom, ha bizonyos feltételek teljesülnek, amelyeket általában az állapotregiszter különböző attribútumainak aktuális értéke szerint állítanak be. Ha a feltétel nem teljesül, akkor a következő programparancs kerül végrehajtásra.

A tulajdonságkezelő parancsok írást biztosítanak - a tulajdonságokat tároló állapotregiszter tartalmának kiolvasását, valamint az egyes tulajdonságok értékeinek megváltoztatását. Például a Pentium processzorok parancsokat hajtanak végre LAHF és SAHF , amelyek az előjeleket tartalmazó alacsony bájtot töltik be az állapotregiszterből EFLAG a regiszter alacsony bájtjára EAXés az alacsony bájt kitöltése ZÁSZLÓK a nyilvántartásból E Ax.. Parancsok CLC, STCállítsa be az átviteli jelző CF=0, CF=1 és a parancs értékeit CMC ennek a tulajdonságnak az értékét megfordítja. Mivel a tulajdonságok határozzák meg a programvégrehajtás folyamatát a feltételes ugrások során, a program vezérlésére általában jellemző változtatási utasításokat használnak.

Processzor vezérlőparancsok . Ebbe a csoportba tartoznak a stop parancsok, a művelet nélkül, valamint számos olyan parancs, amely meghatározza a processzor vagy egyes blokkjainak működési módját. CsapatHLT leállítja a program végrehajtását és a processzort leállított állapotba állítja, amelyből a kilépés megszakítási vagy újraindítási jelek érkezésekor történik ( Visszaállítás). Csapat NOP Egy („üres” utasítás), amely nem okoz semmilyen műveletet, a program késleltetésének megvalósítására vagy a programban keletkezett hiányosságok kitöltésére szolgál.

Különleges csapatok CLI, STI letiltja és engedélyezi a megszakítási kérések szolgáltatását. Processzorokban Pentium vezérlőbitet (flag) használnak erreHA nyilvántartásban ZÁSZLÓK.

Sok modern mikroprocesszor azonosító parancsot ad ki, amely lehetővé teszi a felhasználónak vagy más eszközöknek, hogy információt szerezzenek az adott rendszerben használt processzor típusáról. Processzorokban Pentuim erre való a parancs CPUID , melynek során a feldolgozóról szükséges adatok bekerülnek a nyilvántartásokba EAX,ebx,ECX,EDX majd a felhasználó vagy az operációs rendszer elolvashatja.

A processzor által megvalósított működési módoktól és a feldolgozott adatok meghatározott típusaitól függően a végrehajtható parancsok készlete jelentősen bővíthető.

Egyes processzorok BCD aritmetikai műveleteket hajtanak végre, vagy speciális eredményjavító utasításokat hajtanak végre ilyen számok feldolgozásakor. Számos nagy teljesítményű processzor tartalmaz FPU - számfeldolgozó egység c "lebegőpont".

Számos modern processzorban több egész vagy szám csoportos feldolgozását valósítják meg. c „lebegőpont” egyetlen paranccsal az elv szerint SIMD („Egyetlen utasítás – Több adat ”) - „Egy parancs – Sok adat”. A műveletek egyidejű végrehajtása több operanduson jelentősen megnöveli a processzor teljesítményét, ha video- és hangadatokkal dolgozik. Az ilyen műveleteket széles körben használják a képfeldolgozásban, az audiojel-feldolgozásban és más alkalmazásokban. E műveletek végrehajtásához speciális blokkokat vezetnek be a processzorokba, amelyek végrehajtják a megfelelő utasításkészleteket, amelyek különböző típusú processzorokban ( Pentium, Athlon) kapta a nevetMMX (“ Milti- Média kiterjesztés ”) – Multimédiás kiterjesztés,SSE(" Streaming SIMD Extension ") – SIMD adatfolyam - hosszabbítás, “3 DKiterjesztés- 3D bővítés.

A cég processzorainak jellemző vonása Intel , a 80286-os modelltől kezdődően a memória elérésének elsőbbségi vezérlése, amelyet akkor biztosítanak, ha a processzor védett virtuális cím módban működik - " Védett mód " (védett mód). Ennek az üzemmódnak a megvalósításához speciális parancscsoportokat használnak, amelyek a memóriavédelem megszervezésére szolgálnak az elfogadott prioritási hozzáférési algoritmus szerint.

1.4. témakör Assembler mnemonika. Parancsszerkezet és formátumok. A címzés típusai. Mikroprocesszoros utasításkészlet

Terv:

1 Az összeszerelés nyelve. Alapfogalmak

2 Az összeszerelés nyelvi szimbólumai

3 Az assembler utasítások típusai

4 Szerelési irányelvek

5 Processzor utasításkészlet

1 IAssembly nyelv. Alapfogalmak

Assembly nyelva gépi nyelv szimbolikus ábrázolása. A gépben a legalacsonyabb, hardver szinten lévő összes folyamatot csak a gépnyelv parancsai (utasításai) hajtják végre. Ebből jól látható, hogy a közönséges név ellenére az egyes számítógéptípusok assembly nyelve más és más.

Az assembly nyelvű program memóriablokkok gyűjteménye, az úgynevezett memória szegmensek. Egy program egy vagy több ilyen blokkszegmensből állhat. Minden szegmens nyelvi mondatok gyűjteményét tartalmazza, amelyek mindegyike külön programkódsort foglal el.

Az összeszerelési nyilatkozatoknak négy típusa van:

1) parancsokat vagy utasításokat amelyek a gépi parancsok szimbolikus analógjai. A fordítási folyamat során az összeállítási utasításokat a mikroprocesszor utasításkészletének megfelelő parancsaivá alakítják;

2) makrók -a műsor szövegének bizonyos módon formalizált mondatait az adás során más mondatok helyettesítik;

3) irányelvek,amelyek utasítások az assembler fordítónak bizonyos műveletek végrehajtására. Az irányelveknek nincs megfelelőjük a gépi ábrázolásban;

4) megjegyzés sorok , amely bármilyen karaktert tartalmaz, beleértve az orosz ábécé betűit is. A megjegyzéseket a fordító figyelmen kívül hagyja.

­ Az összeszerelési program felépítése. assembler szintaxis.

A programot alkotó mondatok lehetnek parancsnak, makrónak, direktívának vagy megjegyzésnek megfelelő szintaktikai konstrukciók. Ahhoz, hogy az assembler fordító felismerje őket, bizonyos szintaktikai szabályok szerint kell őket kialakítani. Ehhez a legjobb a nyelv szintaxisának formális leírását használni, például a nyelvtani szabályokat. Egy ilyen programozási nyelv leírásának leggyakoribb módjai - szintaktikai diagramokés a Backus-Naur kiterjesztett formái. Kényelmesebb gyakorlati használatra szintaktikai diagramok. Például az assembly nyelvi utasítások szintaxisa leírható a következő 10., 11., 12. ábrákon látható szintaxisdiagramok segítségével.

10. ábra - Összeállítási mondat formátuma


­ 11. ábra - Az irányelvek formátuma

­ 12. ábra - Parancsok és makrók formátuma

Ezeken a rajzokon:

­ címke neve- azonosító, melynek értéke a program forráskódja mondata első bájtjának címe, amelyet jelöl;

­ név -egy azonosító, amely megkülönbözteti ezt az irányelvet más, azonos nevű irányelvektől. Egy bizonyos direktíva összeállító általi feldolgozása eredményeként ehhez a névhez bizonyos jellemzők rendelhetők;

­ működési kód (COP) és utasítás - ezek a megfelelő gépi utasítás, makróutasítás vagy fordítói utasítás mnemonikus szimbólumai;

­ operandusok -parancs, makró vagy assembler direktíva részei, amelyek olyan objektumokat jelölnek, amelyeken műveleteket hajtanak végre. Az összeállító operandusokat numerikus és szöveges konstansokat tartalmazó kifejezések, változócímkék és műveleti jeleket és néhány fenntartott szót használó azonosítók írják le.

A szintaktikai diagramok segítenek keresse meg és járja be az utat a diagram bemenetétől (balra) a kimenetéig (jobbra). Ha létezik ilyen út, akkor a mondat vagy szerkezet szintaktikailag helyes. Ha nincs ilyen útvonal, akkor a fordító nem fogadja el ezt a konstrukciót.

­ 2 Az összeszerelés nyelvi szimbólumai

A programok szövegének írásakor megengedett karakterek:

1) összes latin betű: A-Z,a-z. Ebben az esetben a nagy- és kisbetűket egyenértékűnek tekintjük;

2) számok innen 0 előtt 9 ;

3) jelek ? , @ , $ , _ , & ;

4) elválasztók , . () < > { } + / * % ! " " ? = # ^ .

Assembler mondatok képezik tokenek, amelyek szintaktikailag elválaszthatatlan nyelvi karaktersorozatok, amelyek értelmet adnak a fordító számára.

tokenek vannak:

1) azonosítók - programobjektumok, például műveleti kódok, változónevek és címkenevek kijelölésére használt érvényes karaktersorozatok. Az azonosítók írásának szabálya a következő: egy azonosító egy vagy több karakterből állhat;

2) karakterláncok - karaktersorozatok szimpla vagy dupla idézőjelbe zárva;

3) egész számok a következő számrendszerek egyikében : bináris, decimális, hexadecimális. A számok azonosítása az assembler programokban történő íráskor bizonyos szabályok szerint történik:

4) a decimális számok azonosításához nincs szükség további szimbólumokra, például 25 vagy 139. A program forráskódjában történő azonosításhoz bináris számok az összetételükben szereplő nullák és egyesek beírása után szükséges a latin „ b”, például 10010101 b.

5) A hexadecimális számok jelölésében több konvenció található:

Először is számokból állnak. 0...9 , a latin ábécé kis- és nagybetűi a,b, c,d,e,f vagy A,B,C,D,E,F.

Másodszor, a fordítónak nehézségei lehetnek a hexadecimális számok felismerésében, mivel azok állhatnak egyedül 0...9 számjegyekből (például 190845), vagy kezdődhetnek a latin ábécé betűjével (például ef15). Annak érdekében, hogy a fordító „megmagyarázza”, hogy az adott lexéma nem decimális szám vagy azonosító, a programozónak speciálisan ki kell jelölnie a hexadecimális számot. Ehhez a hexadecimális számot alkotó hexadecimális számjegyek sorozatának végére írja be a latin betűt " h". Ez előfeltétel. Ha egy hexadecimális szám betűvel kezdődik, akkor azt egy kezdő nulla előzi meg: 0 ef15 h.

Szinte minden mondat tartalmazza annak a tárgynak a leírását, amelyen vagy amelynek segítségével valamilyen műveletet végrehajtanak. Ezeket az objektumokat ún operandusok. Így definiálhatók: operandusok- ezek olyan objektumok (egyes értékek, regiszterek vagy memóriacellák), amelyeket utasítások vagy direktívák érintenek, vagy olyan objektumok, amelyek meghatározzák vagy finomítják az utasítások vagy direktívák működését.

Lehetőség van az operandusok alábbi osztályozására:

­ állandó vagy azonnali operandusok;

­ cím operandusok;

­ mozgatott operandusok;

címszámláló;

­ operandus regisztrálása;

­ alap- és index-operandusok;

­ strukturális operandusok;

rekordokat.

Az operandusok olyan elemi komponensek, amelyek a gépi utasítás részét képezik, és azokat az objektumokat jelölik, amelyeken a műveletet végrehajtják. Általánosabb esetben az operandusok komponensekként beépíthetők az úgynevezett összetettebb formációkba kifejezéseket.

Kifejezések operandusok és operátorok egészének tekintett kombinációi. A kifejezés kiértékelés eredménye lehet valamilyen memóriacella címe vagy valamilyen állandó (abszolút) érték.

­ 3 Az assembler utasítások típusai

Soroljuk fel a lehetséges típusokat assembler nyilatkozatokés szintaktikai szabályok az assembler kifejezések kialakításához:

­ aritmetikai operátorok;

­ műszakkezelők;

­ összehasonlító operátorok;

­ logikai operátorok;

­ index operátor;

­ type override operátor;

­ szegmens újradefiniáló operátor;

­ szerkezet típus elnevezési operátor;

­ operátor a kifejezés címének szegmenskomponensének megszerzéséhez;

­ kifejezés offset get operátor.

1 Szerelési irányelvek

­ Az Assembler utasításai a következők:

1) Szegmentációs irányelvek. Az előző megbeszélés során megismertük az összes alapvető szabályt az utasítások és operandusok assembly nyelvű programban történő írására. Nyitva marad az a kérdés, hogyan kell megfelelően formázni a parancssorokat, hogy a fordító feldolgozhassa, a mikroprocesszor pedig végrehajthassa azokat.

A mikroprocesszor architektúráját vizsgálva megtudtuk, hogy hat szegmensregisztere van, amelyeken keresztül egyszerre tud dolgozni:

­ egy kódszegmenssel;

­ egy verem szegmenssel;

­ egy adatszegmenssel;

­ három további adatszegmenssel.

Fizikailag a szegmens egy memóriaterület, amelyet parancsok és (vagy) adatok foglalnak el, amelyek címét a megfelelő szegmensregiszterben lévő értékhez viszonyítva számítják ki. Szintaxis leírása szegmens az assemblerben a 13. ábrán látható felépítés:


­ 13. ábra - A szegmens szintaktikai leírása az assemblerben

Fontos megjegyezni, hogy egy szegmens funkcionalitása valamivel tágabb annál, mint a program egyszerű kód-, adat- és veremblokkokra bontása. A szegmentáció egy általánosabb mechanizmus része moduláris programozás fogalma. Ez magában foglalja a fordító által létrehozott objektummodulok tervezésének egységesítését, beleértve a különböző programozási nyelvekből származókat is. Ez lehetővé teszi a különböző nyelveken írt programok kombinálását. A SEGMENT direktívában szereplő operandusok egy ilyen unió különféle lehetőségeinek megvalósítására szolgálnak.

2) Vezérlési irányelvek listázása. A listakezelési direktívák a következő csoportokra oszthatók:

­ általános listázás-ellenőrzési irányelvek;

­ kimeneti direktívák, amelyek tartalmazzák a fájllistát;

­ kimeneti direktívák feltételes összeállítási blokkokhoz;

­ kimeneti direktívák a makrók listájához;

­ direktívák a listában található kereszthivatkozásokkal kapcsolatos információk megjelenítésére;

­ formátummódosítási direktívák felsorolása.

2 Processzor utasításkészlet

A processzor utasításkészletét a 14. ábra mutatja.

Tekintsük a parancsok fő csoportjait.

­ 14. ábra - Az összeszerelési utasítások osztályozása

A parancsok a következők:

1 Adatátviteli parancsok. Ezek az utasítások nagyon fontos helyet foglalnak el minden processzor utasításkészletében. A következő alapvető funkciókat látják el:

­ a processzor belső regisztereinek tartalmának tárolása a memóriában;

­ tartalom másolása egyik memóriaterületről a másikra;

­ írás I/O eszközökre és olvasás I/O eszközökről.

Egyes processzorokban mindezeket a funkciókat egyetlen utasítás hajtja végre MOV (byte átvitelhez - MOVB ) orr különféle módszerek operandus címzés.

Más processzorokban az utasításon kívül MOV a felsorolt ​​funkciók végrehajtásához számos további parancs is rendelkezésre áll. Az adatátviteli parancsok közé tartoznak az információcsere parancsok is (elnevezésük a szón alapul Csere ). Lehetséges lehet biztosítani a belső nyilvántartások közötti információcserét, egy regiszter két fele között ( CSERE ) vagy egy regiszter és egy memóriahely között.

2 Aritmetikai parancsok. Az aritmetikai utasítások az operanduskódokat numerikus bináris vagy BCD kódként kezelik. Ezek a parancsok öt fő csoportra oszthatók:

­ parancsok fixpontos műveletekhez (összeadás, kivonás, szorzás, osztás);

­ lebegőpontos utasítások (összeadás, kivonás, szorzás, osztás);

­ tisztítási parancsok;

­ növelés és csökkentés parancsok;

­ összehasonlító parancs.

3 A fixpontos utasítások a processzorregiszterekben vagy a memóriában lévő kódokon működnek, mint a normál bináris kódoknál. A lebegőpontos (pontos) utasítások számábrázolási formátumot használnak kitevővel és mantisszával (általában ezek a számok két egymást követő memóriahelyet foglalnak el). Modernben erős processzorok a lebegőpontos utasításkészlet nem korlátozódik csupán négy aritmetikai műveletre, hanem sok más összetettebb utasítást is tartalmaz, például trigonometrikus függvények számítását, logaritmikus függvényeket, valamint a hang- és képfeldolgozáshoz szükséges komplex függvényeket.

4 A törlési parancsok arra szolgálnak, hogy nulla kódot írjanak egy regiszterbe vagy memóriacellába. Ezek a parancsok helyettesíthetők nulla kódú átviteli utasításokkal, de a speciális egyértelmű utasítások általában gyorsabbak, mint az átviteli utasítások.

5 Növelési (eggyel növelési) és csökkentési parancsok

(egy csökkentés) szintén nagyon kényelmesek. Elvileg helyettesíthetők összeadás vagy kivonás egy utasítással, de a növelés és a csökkentés gyorsabb, mint az összeadás és a kivonás. Ezek az utasítások egy bemeneti operandust igényelnek, amely egyben kimeneti operandus is.

6 Az Összehasonlítás utasítás két bemeneti operandus összehasonlítására szolgál. Valójában ennek a két operandusnak a különbségét számítja ki, de nem képezi a kimeneti operandust, hanem csak a processzorállapot-regiszter bitjeit változtatja meg ennek a kivonásnak az eredménye alapján. Az összehasonlítási utasítást követő utasítás (általában ugrás) elemzi a processzor állapotregiszterében lévő biteket, és azok értékei alapján hajt végre műveleteket. Egyes processzorok utasításokat adnak a memóriában lévő operandusok két sorozatának lánc-összehasonlításához.

7 Logikai parancsok. A logikai utasítások logikai (bitenkénti) műveleteket hajtanak végre az operandusokon, vagyis az operanduskódokat nem egyetlen számnak, hanem egyedi bitek halmazának tekintik. Ebben különböznek az aritmetikai parancsoktól. A logikai parancsok a következő alapvető műveleteket hajtják végre:

­ logikai ÉS, logikai VAGY, modulo 2 összeadás (XOR);

­ logikai, aritmetikai és ciklikus eltolások;

­ bitek és operandusok ellenőrzése;

­ a processzor állapotregiszter bitjeinek (jelzőinek) beállítása és törlése ( PSW).

A logikai utasítások lehetővé teszik az alapvető logikai függvények bitenkénti kiszámítását két bemeneti operandusból. Emellett az ÉS művelettel kényszerítjük ki az adott bitek törlését (az egyik operandus a maszkkód, amelyben a törlést igénylő biteket nullára állítjuk). Az VAGY művelet a beállított bitek erőltetésére szolgál (az operandusok egyikeként a maszkkódot használjuk, amelyben az egyesre állítást igénylő bitek egyenlők eggyel). Az XOR művelettel invertáljuk a megadott biteket (az egyik operandusként a maszk kódot használjuk, amelyben az invertálni kívánt biteket egyre állítjuk). Az utasításokhoz két bemeneti operandusra van szükség, és egy kimeneti operandust alkotnak.

8 A shift parancsok lehetővé teszik, hogy az operandus kódját bitenként jobbra (az alsó bitek felé) vagy balra (a magasabb bitek felé) tolja el. Az eltolás típusa (logikai, aritmetikai vagy ciklikus) határozza meg, hogy mi lesz a legjelentősebb bit új értéke (jobbra tolva) vagy legkisebb jelentőségű bit (balra tolva), és azt is, hogy a legjelentősebb bit régi értéke legyen-e. bit el lesz tárolva valahol (balra tolva) vagy a legkisebb jelentőségű bit (jobbra tolva). A forgó eltolás lehetővé teszi az operanduskód bitjei körben történő eltolását (jobbra való eltolásnál az óramutató járásával megegyező irányba, balra való eltolásnál az óramutató járásával ellentétes irányba). Ebben az esetben a váltógyűrű tartalmazhatja vagy nem tartalmazza a hordozózászlót. A carry flag bit (ha van ilyen) a legjelentősebb bitre van beállítva balra forgatásnál, és a legkisebb jelentőségű bitre jobbra forgatásnál. Ennek megfelelően a hordozójelző bit értéke a legkevésbé jelentős bitre lesz átírva balra ciklikus eltolásnál, és a legjelentősebb bitre jobbra ciklikus eltolásnál.

9 Ugrás parancsok. Az ugrásparancsok mindenféle hurok, elágazás, szubrutinhívás stb. megszervezésére szolgálnak, vagyis megzavarják a program szekvenciális folyamatát. Ezek az utasítások új értéket írnak az utasításszámláló regiszterbe, és ezáltal a processzor nem a sorrendben következő utasításra ugrik, hanem a programmemóriában lévő bármely más utasításra. Egyes ugrási parancsok lehetővé teszik, hogy visszalépjen arra a pontra, ahonnan az ugrás történt, míg mások nem. Ha visszaküldés van megadva, akkor az aktuális processzorparaméterek a veremben tárolódnak. Ha nincs visszaküldés, akkor az aktuális processzorparaméterek nem kerülnek mentésre.

A visszalépés nélküli ugrási parancsok két csoportra oszthatók:

­ feltétel nélküli ugrások parancsai;

­ feltételes ugrási utasítások.

Ezek a parancsok a szavakat használják Branch (ág) és Jump (ugrás).

A feltétel nélküli ugrási utasítások mindentől függetlenül új címre ugrást okoznak. Ugrást okozhatnak a megadott eltolási értékre (előre vagy hátra), vagy a megadott memóriacímre. Bemeneti operandusként az eltolási értéket vagy az új címértéket adjuk meg.

A feltételes ugrási parancsok nem mindig okoznak ugrást, hanem csak akkor, ha a megadott feltételek teljesülnek. Ilyen feltételek általában a processzorállapot-regiszter jelzőinek értékei ( PSW ). Vagyis az átmeneti feltétel az előző művelet eredménye, amely megváltoztatja a zászlók értékeit. Összesen 4-16 ilyen ugrási feltétel lehet. Néhány példa a feltételes ugrási parancsokra:

­ ugrás, ha egyenlő nullával;

­ ugrás, ha nem nulla;

­ ugrás, ha túlcsordulás van;

­ ugrás, ha nincs túlcsordulás;

­ ugrás, ha nagyobb nullánál;

­ ugrás, ha kisebb vagy egyenlő nullával.

Ha az átmeneti feltétel teljesül, akkor egy új érték kerül betöltésre az utasításszámláló regiszterébe. Ha az ugrás feltétele nem teljesül, akkor az utasításszámláló egyszerűen megnövekszik, és a processzor kiválasztja és sorban végrehajtja a következő utasítást.

Kifejezetten az elágazási feltételek ellenőrzésére egy összehasonlító utasítást (CMP) használnak, amely megelőzi a feltételes ugrási utasítást (vagy akár több feltételes ugrási utasítást). De a zászlók bármilyen más paranccsal beállíthatók, például adatátviteli paranccsal, bármilyen aritmetikai vagy logikai paranccsal. Vegye figyelembe, hogy maguk az ugrási parancsok nem változtatják meg a zászlókat, ami csak lehetővé teszi, hogy több ugrási parancsot egymás után helyezzen el.

A megszakítási parancsok különleges helyet foglalnak el a visszatéréssel járó ugrási parancsok között. Ezek az utasítások megszakítási számot (vektorcímet) igényelnek bemeneti operandusként.

Következtetés:

Az assembly nyelv a gépi nyelv szimbolikus ábrázolása. Az egyes számítógéptípusok összeállítási nyelve eltérő. Az assembly nyelvű program memóriablokkok, úgynevezett memóriaszegmensek gyűjteménye. Minden szegmens nyelvi mondatok gyűjteményét tartalmazza, amelyek mindegyike külön programkódsort foglal el. Az összeállítási utasításoknak négy típusa van: parancsok vagy utasítások, makrók, direktívák, megjegyzéssorok.

A programok szövegének írásakor érvényes karakterek mind latin betűk: A-Z,a-z. Ebben az esetben a nagy- és kisbetűket egyenértékűnek tekintjük; számok a 0 előtt 9 ; jelek ? , @ , $ , _ , & ; elválasztók , . () < > { } + / * % ! " " ? = # ^ .

A következő típusú assembler utasítások és szintaktikai szabályok vonatkoznak az assembler kifejezések kialakítására. aritmetikai operátorok, shift operátorok, összehasonlító operátorok, logikai operátorok, index operátorok, típus újradefiniáló operátorok, szegmens újradefiniáló operátorok, struktúra típus elnevezési operátorok, kifejezés cím szegmens beszerző operátorok, kifejezés offset beszerző operátorok.

A parancsnoki rendszer 8 fő csoportra oszlik.

­ Tesztkérdések:

1 Mi az assembly nyelv?

2 Milyen szimbólumokkal lehet parancsokat írni az assemblerben?

3 Mik azok a címkék és mi a céljuk?

4 Ismertesse az összeszerelési útmutató felépítését!

5 Soroljon fel 4 típusú assembler utasítást!

ÜZBEKisztáni NEMZETI EGYETEM MIRZO ULUGBEK NEVE

SZÁMÍTÁSTECHNOLÓGIAI KAR

A témában: EXE fájl szemantikai elemzése.

Elkészült:

Taskent 2003.

Előszó.

Összeállítás nyelve és utasítási szerkezete.

EXE fájl szerkezet ( szemantikai elemzés).

Egy COM-fájl szerkezete.

Hogyan működik és terjed a vírus.

Szétszerelő.

Programok.

Előszó

A programozói szakma csodálatos és egyedülálló. Korunkban a tudomány és az élet nem képzelhető el nélküle legújabb technológia. Minden, ami az emberi tevékenységhez kapcsolódik, nem teljes a számítástechnika nélkül. Ez pedig hozzájárul magas szintű fejlődéséhez és tökéletesítéséhez. Bár a személyi számítógépek fejlesztése nem olyan régen kezdődött, de ez idő alatt óriási lépések történtek a szoftvertermékek és egyebek terén. hosszú ideje ezeket a termékeket széles körben használják majd. A számítógéppel kapcsolatos ismeretek területe robbanásszerűen bővült, akárcsak a kapcsolódó technológia. Ha nem vesszük figyelembe a kereskedelmi oldalt, akkor azt mondhatjuk, hogy a szakmai tevékenység ezen a területén nincsenek idegenek. Sokan nem haszonszerzésből vagy keresetből, hanem szabad akaratukból, szenvedélyből foglalkoznak programok kidolgozásával. Ez persze nem befolyásolhatja a műsor minőségét, és ebben az üzletágban úgymond verseny és igény van a minőségi előadásra, a stabil munkavégzésés minden modern követelménynek megfelel. Itt érdemes megjegyezni a mikroprocesszorok megjelenését is a 60-as években, amelyek számos lámpakészletet helyettesítettek. Vannak olyan mikroprocesszorok, amelyek nagyon különböznek egymástól. Ezek a mikroprocesszorok a bitkapacitás és a beépített rendszerparancsok tekintetében különböznek egymástól. A leggyakoribbak: Intel, IBM, Celeron, AMD stb. Mindezek a processzorok a fejlett processzorarchitektúrához kapcsolódnak az Intel által. A mikroszámítógépek elterjedése két fő ok miatt váltotta ki az assembly nyelvvel kapcsolatos attitűdök újragondolását. Először is, az assembly nyelven írt programok lényegesen kevesebb memóriát és futásidőt igényelnek. Másodszor, az assembly nyelv és az így létrejövő gépi kód ismerete lehetővé teszi a gépi architektúra megértését, amely magas szintű nyelven történő munkavégzés során aligha biztosítható. Bár a legtöbb szoftvermérnök olyan magas szintű nyelveken fejleszt, mint a Pascal, C vagy Delphi, amelyek könnyebben írhatók programokat, a legerősebb és leghatékonyabb szoftver részben vagy egészben assembly nyelven íródott. A magas szintű nyelveket úgy tervezték, hogy elkerüljék az egyes számítógépek speciális technikai jellemzőit. Az assembly nyelvet pedig a processzor sajátosságaihoz tervezték. Ezért ahhoz, hogy egy assembly nyelvű programot írhassunk egy adott számítógépre, ismerni kell annak architektúráját. Napjainkban a nézet a fő szoftver termék egy EXE fájl. Ennek pozitív oldalait tekintve a program készítője biztos lehet a sérthetetlenségében. De ez gyakran távolról sem így van. Van egy szétszerelő is. Disassembler segítségével megtudhatja a megszakításokat és a programkódokat. Az assemblerben jártas embernek nem lesz nehéz az egész programot ízlése szerint átdolgozni. Talán innen ered a leginkább megoldhatatlan probléma - a vírus. Miért írnak az emberek vírust? Van, aki meglepetten, van, aki dühösen teszi fel ezt a kérdést, de ennek ellenére még mindig vannak, akiket ez a feladat nem a károkozás, hanem a rendszerprogramozás szempontjából érdekel. A vírusokat különféle okok miatt írják. Vannak, akik szeretik a rendszerhívásokat, mások az assemblerben fejlesztik tudásukat. Megpróbálom mindezt elmagyarázni magamban lejáratú papírok. Nem csak az EXE fájl szerkezetéről szól, hanem az assembly nyelvről is.

^ Assembly Language.

Érdekes követni az első számítógépek megjelenésétől kezdve napjainkig az assembly nyelvről alkotott elképzelések átalakulását a programozók körében.

Valamikor régen az assembler egy olyan nyelv volt, amelynek ismerete nélkül lehetetlen volt a számítógépet valami hasznosra késztetni. Fokozatosan változott a helyzet. Megjelentek a számítógéppel való kommunikáció kényelmesebb módjai. De más nyelvekkel ellentétben az assembler nem halt meg, sőt, ezt elvileg nem is tudta megtenni. Miért? A választ keresve megpróbáljuk megérteni, mi az assembly nyelv általában.

Röviden, az assembly nyelv a gépi nyelv szimbolikus reprezentációja. A gépben a legalacsonyabb, hardver szinten lévő összes folyamatot csak a gépnyelv parancsai (utasításai) hajtják végre. Ebből jól látható, hogy a közönséges név ellenére az egyes számítógéptípusok assembly nyelve más és más. Ez is érvényes megjelenés az assemblerben írt programokat, és azokat az ötleteket, amelyeket ez a nyelv tükröz.

A hardverrel kapcsolatos problémákat (sőt, a hardverrel kapcsolatos problémákat, például a program sebességének javítását) az assembler ismerete nélkül nem lehet igazán megoldani.

A programozó vagy bármely más felhasználó bármilyen magas szintű eszközt használhat, akár a virtuális világok építésére szolgáló programokat is, és talán nem is sejtheti, hogy a számítógép valójában nem a programja nyelvének parancsait hajtja végre, hanem azok parancsait. átalakított reprezentáció egy teljesen más nyelv - gépi nyelv - unalmas és unalmas parancssorozatai formájában. Most képzeljük el, hogy egy ilyen felhasználónak nem szabványos problémája van, vagy csak valami elromlott. Például a programjának valamilyen szokatlan eszközzel kell működnie, vagy más műveleteket kell végrehajtania, amelyek a számítógépes hardver alapelveinek ismeretét igénylik. Bármilyen okos is egy programozó, bármilyen jó nyelven írta csodálatos programját, nem nélkülözheti az assembler ismereteit. És nem véletlen, hogy a magas szintű nyelvek szinte minden fordítója tartalmaz olyan eszközöket, amelyek moduljait az assemblerben lévő modulokkal összekapcsolják, vagy támogatják az assembler programozási szint elérését.

Persze a számítógépes kocsik ideje már elmúlt. Ahogy a mondás tartja, nem lehet elfogadni a mérhetetlenséget. De van valami közös, egyfajta alap, amire minden komoly számítógépes oktatás épül. Ez a számítógép működésének alapelveiről, architektúrájáról és assembly nyelvéről szóló ismeret, amely ennek a tudásnak a tükröződése és megtestesülése.

Egy tipikus modern számítógép (i486 vagy Pentium alapú) a következő összetevőkből áll (1. ábra).

Rizs. 1. Számítógép és perifériák

Rizs. 2. Személyi számítógép blokkvázlata

Az ábrán (1. ábra) látható, hogy a számítógép több fizikai eszközből áll, amelyek mindegyike egy egységhez, az úgynevezett rendszeregységhez kapcsolódik. Logikailag egyértelmű, hogy valamilyen koordináló eszköz szerepét tölti be. Vessünk egy pillantást belülre rendszerblokk(nem kell megpróbálni bejutni a monitorba - nincs ott semmi érdekes, ráadásul veszélyes): kinyitjuk a tokot és látunk néhány táblát, blokkot, csatlakozó vezetékeket. Ahhoz, hogy megértsük működésüket, nézzük meg blokk diagramm tipikus számítógép (2. ábra). Nem állítja magát az abszolút pontosságra, és csupán egy modern személyi számítógép céljának, összekapcsolásának és elemeinek tipikus összetételének bemutatására irányul.

Vizsgáljuk meg az ábrán látható diagramot. 2 kissé szokatlan stílusban.
Az emberi természethez tartozik, hogy valami újjal találkozva keressen olyan asszociációkat, amelyek segíthetnek megismerni az ismeretlent. Milyen asszociációkat vált ki a számítógép? Számomra például a számítógép gyakran magával az emberrel asszociálódik. Miért?

Valahol önmaga mélyén egy számítógépet létrehozó személy azt gondolta, hogy valami hasonlót hoz létre önmagához. A számítógép rendelkezik a külvilágból származó információk észlelésének szerveivel - ez egy billentyűzet, egér, mágneses lemezmeghajtók. ábrán. 2 ezek a szervek a rendszerbuszoktól jobbra találhatók. A számítógépnek olyan szervei vannak, amelyek „emésztik” a kapott információkat - ez a központi processzor és RAM. És végül a számítógép beszédszervekkel rendelkezik, amelyek kiadják a feldolgozás eredményeit. Ez is néhány eszköz a jobb oldalon.

A modern számítógépek természetesen távol állnak az embertől. Olyan lényekhez hasonlíthatók, amelyek a külvilággal egy nagy, de korlátozott feltétel nélküli reflexkészlet szintjén lépnek kapcsolatba.
Ez a reflexkészlet a gépi utasítások rendszerét alkotja. Bármilyen magas szinten is kommunikál a számítógéppel, a végén minden a gépi utasítások unalmas és monoton sorozatából adódik.
Minden gépi parancs egyfajta inger az adott vagy annak a feltétlen reflexnek a gerjesztésére. Az erre az ingerre adott reakció mindig egyértelmű, és a mikroparancsok blokkjában „be van kötve”, mikroprogram formájában. Ez a mikroprogram egy gépi parancs végrehajtására irányuló műveleteket is végrehajt, de már bizonyos számítógépes logikai áramkörökhöz továbbított jelek szintjén, ezáltal vezérelve különböző számítógépes alrendszereket. Ez az úgynevezett mikroprogram-vezérlés elve.

Folytatva az analógiát egy személlyel, megjegyezzük: ahhoz, hogy a számítógép megfelelően étkezzen, számos operációs rendszert, fordítóprogramot több száz programozási nyelvhez stb. ételt (programokat) bizonyos szabályok szerint szállítanak gyomor (számítógép). Csak a számítógép gyomra szereti a diétás, monoton ételeket – adjon neki strukturált információkat, szigorúan szervezett nullák és egyesek sorozatai formájában, amelyek kombinációi alkotják a gépi nyelvet.

Így külsőleg poliglottként a számítógép csak egy nyelvet ért - a gépi utasítások nyelvét. Természetesen a számítógéppel való kommunikációhoz és munkához nem szükséges tudni ezt a nyelvet, de szinte minden profi programozó előbb-utóbb szembesül azzal, hogy el kell tanulnia. Szerencsére a programozónak nem kell megpróbálnia kitalálni a bináris számok különféle kombinációinak jelentését, mivel a programozók már az 50-es években elkezdték a gépi nyelv szimbolikus analógját használni a programozáshoz, amelyet assembly nyelvnek neveztek. Ez a nyelv pontosan tükrözi a gépi nyelv összes jellemzőjét. Ez az oka annak, hogy a magas szintű nyelvektől eltérően az assembly nyelv minden számítógéptípusnál eltérő.

A fentiekből arra a következtetésre juthatunk, hogy mivel a számítógép assembly nyelve „natív”, a leghatékonyabb program csak erre írható (feltéve, hogy azt képzett programozó írja). Van itt egy apró „de”: ez egy nagyon fáradságos folyamat, amely sok figyelmet és gyakorlati tapasztalatot igényel. Ezért a valóságban az assembler főként olyan programokat ír, amelyeknek biztosítaniuk kell a hardverrel való hatékony munkát. Néha a program kritikus részei a végrehajtási idő vagy a memóriafelhasználás szempontjából az assemblerben vannak megírva. Ezt követően szubrutinok formájában készülnek, és magas szintű nyelvi kóddal kombinálják.

Bármely számítógép assembly nyelvét csak akkor érdemes elkezdeni tanulni, ha megtudjuk, hogy a számítógép mely része maradt látható és programozható ezen a nyelven. Ez az úgynevezett számítógépes programmodell, melynek része a mikroprocesszoros programmodell, amely 32 regisztert tartalmaz, amelyek többé-kevésbé a programozó számára elérhetőek.

Ezek a regiszterek két nagy csoportra oszthatók:

^16 egyedi regiszter;

16 rendszerregiszter.

Az Assembly nyelvi programok nagyon erősen használnak regisztereket. A legtöbb regiszternek meghatározott funkcionális célja van.

Ahogy a neve is sugallja, a felhasználói regisztereket azért hívják, mert a programozó ezeket használhatja programjai írásakor. Ezek a regiszterek a következőket tartalmazzák (3. ábra):

Nyolc 32 bites regiszter, amelyeket a programozók használhatnak adatok és címek tárolására (más néven általános célú regiszterek (RON)):

hat szegmensregiszter: cs, ds, ss, es, fs, gs;

állapot- és ellenőrzési nyilvántartások:

Flags regisztrálja a zászlókat/zászlókat;

eip/ip parancsmutató regiszter.

Rizs. 3. Az i486 és Pentium mikroprocesszorok felhasználói regiszterei

Miért jelenik meg sok ilyen regiszter perjellel? Nem, ezek nem különböző regiszterek – egy nagy, 32 bites regiszter részei. A programban külön objektumként használhatók. Ez azért történt, hogy biztosítsák az Intel fiatalabb, 16 bites mikroprocesszoros modelljeihez írt programok működőképességét, kezdve az i8086-tól. Az i486 és Pentium mikroprocesszorok többnyire 32 bites regiszterekkel rendelkeznek. Számuk a szegmensregiszterek kivételével megegyezik az i8086-éval, de a méretük nagyobb, ami a megnevezésükben is megmutatkozik -
e előtag (Bővített).

^ Általános célú nyilvántartások
Ennek a csoportnak minden regisztere lehetővé teszi az „alsó” részekhez való hozzáférést (lásd 3. ábra). Ha ezt az ábrát nézi, vegye figyelembe, hogy ezeknek a regisztereknek csak az alsó 16 és 8 bites része használható öncímzésre. Ezeknek a regisztereknek a felső 16 bitje nem érhető el független objektumként. Ez, amint fentebb megjegyeztük, az Intel fiatalabb, 16 bites mikroprocesszoros modelljeivel való kompatibilitás érdekében történik.

Soroljuk fel az általános célú regiszterek csoportjába tartozó regisztereket! Mivel ezek a regiszterek fizikailag az aritmetikai logikai egységben (ALU) belüli mikroprocesszorban találhatók, ALU regisztereknek is nevezik őket:

eax/ax/ah/al (Akkumulátor regiszter) - akkumulátor.
Köztes adatok tárolására szolgál. Egyes parancsokban ennek a regiszternek a használata kötelező;

ebx/bx/bh/bl (Alapregiszter) - alapregiszter.
Valamely objektum alapcímének tárolására szolgál a memóriában;

ecx/cx/ch/cl (Count register) - számlálóregiszter.
Olyan parancsokban használatos, amelyek bizonyos ismétlődő műveleteket hajtanak végre. Használata gyakran implicit és rejtett a megfelelő parancs algoritmusában.
Például a hurokszervezési parancs amellett, hogy átadja a vezérlést egy bizonyos címen található parancsnak, elemzi és eggyel csökkenti az ecx/cx regiszter értékét;

edx/dx/dh/dl (Adatregiszter) - adatregiszter.
Csakúgy, mint az eax/ax/ah/al regiszter, közbenső adatokat tárol. Néhány parancs megköveteli a használatát; egyes parancsoknál ez implicit módon történik.

A következő két regiszter támogatja az úgynevezett láncműveleteket, azaz olyan műveleteket, amelyek szekvenciálisan feldolgozzák az elemek láncait, amelyek mindegyike 32, 16 vagy 8 bites lehet:

esi/si (Source Index register) - forrásindex.
Ez a láncműveletek regisztere tartalmazza a forráslánc elemének aktuális címét;

edi/di (Cél Index regiszter) - a vevő (címzett) indexe.
Ez a láncműveletek regisztere tartalmazza a céllánc aktuális címét.

A mikroprocesszor architektúrájában hardver és szoftver szinten az ilyen adatstruktúra, mint a verem támogatott. A mikroprocesszoros utasításrendszerben lévő verem használatához speciális parancsok vannak, a mikroprocesszoros szoftvermodellben pedig speciális regiszterek vannak erre:

esp/sp (Stack Pointer register) - veremmutató regiszter.
Az aktuális veremszegmensben lévő verem tetejére mutató mutatót tartalmaz.

ebp/bp (Base Pointer register) - verem keret alapmutató regiszter.
A veremben lévő adatok véletlenszerű elérésének megszervezésére tervezték.

A verem egy programterület tetszőleges adatok ideiglenes tárolására. Természetesen az adatszegmensben is tárolhatók adatok, de ebben az esetben minden ideiglenesen tárolt adathoz külön elnevezett memóriacellát kell létrehozni, ami növeli a program méretét és a felhasznált nevek számát. A verem kényelme, hogy a területét újra felhasználják, és az adatok veremben való tárolása és onnan való lekérése hatékony push és pop parancsokkal történik, nevek megadása nélkül.
A verem hagyományosan például a program által használt regiszterek tartalmának tárolására szolgál egy szubrutin hívása előtt, amely viszont a processzor regisztereit "saját céljaira" használja. A regiszterek eredeti tartalma az alprogramból való visszatéréskor kiszivárog a veremből. Egy másik gyakori technika a szükséges paraméterek átadása egy szubrutinnak a veremen keresztül. A szubrutin, tudva, hogy a paraméterek milyen sorrendben kerülnek a verembe, onnan átveheti és felhasználhatja a végrehajtás során. Megkülönböztető tulajdonság A verem egyfajta mintavételi sorrend a benne foglalt adatokból: bármikor csak a legfelső elem érhető el a veremen, azaz. a verembe utolsóként betöltött elem. A legfelső elem kiemelése a veremből elérhetővé teszi a következő elemet. A verem elemei a verem számára lefoglalt memória területén helyezkednek el, kezdve a verem aljától (azaz a maximális címétől) az egymás után csökkenő címekig. A legfelső elérhető elem címét az SP veremmutató regiszter tárolja. A programmemória bármely más területéhez hasonlóan a veremnek valamilyen szegmensbe kell tartoznia, vagy külön szegmenst kell képeznie. Mindkét esetben az adott szegmens szegmenscíme az SS szegmensveremregiszterbe kerül. Így egy SS:SP regiszterpár leírja egy elérhető veremcella címét: az SS a verem szegmenscímét, az SP pedig a veremben tárolt utolsó adatok eltolását tárolja (4. ábra, a). Figyeljünk arra, hogy a kezdeti állapotban az SP veremmutató egy olyan cellára mutat, amely a verem alja alatt fekszik, és nincs benne.

4. ábra Verem felépítése: a - kezdeti állapot, b - egy elem betöltése után (ebben a példában az AX regiszter tartalma), c - a második elem betöltése után (a DS regiszter tartalma), d - egy elem kirakása után elem, e - két elem kirakása után, és visszatér az eredeti állapotba.

A verembe való betöltés egy speciális push stack paranccsal történik. Ez az utasítás először 2-vel csökkenti a veremmutató tartalmát, majd az operandust az SP-ben lévő címre helyezi. Ha például ideiglenesen el akarjuk menteni az AX regiszter tartalmát a verembe, akkor végre kell hajtanunk a parancsot

A verem átvált az ábrán látható állapotba. 1.10, b. Látható, hogy a veremmutató két bájttal feljebb tolódik (alacsonyabb címek felé), és erre a címre íródik a push parancsban megadott operandus. A következő parancs a verembe való betöltéshez, például:

ábrán látható állapotba helyezi a veremet. 1.10, c. A verem most két elemet fog tartalmazni, és csak a legfelső lesz elérhető, amelyre az SP veremmutató mutat. Ha egy idő után vissza kell állítani a verembe mentett regiszterek eredeti tartalmát, akkor a veremből kell végrehajtanunk a pop parancsokat (pop):

pop DS
pop AX

Mekkora legyen a köteg? Attól függ, hogy milyen intenzíven használják a programban. Ha például egy 10 000 bájtos tömböt szeretne tárolni a veremben, akkor a veremnek legalább ekkora méretűnek kell lennie. Nem szabad megfeledkezni arról, hogy bizonyos esetekben a rendszer automatikusan használja a veremet, különösen az int 21h megszakítási parancs végrehajtásakor. Ezzel a paranccsal a processzor először a visszatérési címet tolja a verembe, majd a DOS oda tolja a regiszterek tartalmát és a megszakított programmal kapcsolatos egyéb információkat. Ezért még akkor is, ha a program egyáltalán nem használja a veremet, akkor is jelen kell lennie a programban, és legalább több tíz szóból kell állnia. Első példánkban 128 szót tettünk a verembe, ami mindenképpen elég.

^ Összeszerelő program felépítése

Az assembly nyelvű program memóriablokkok, úgynevezett memóriaszegmensek gyűjteménye. Egy program egy vagy több ilyen blokkszegmensből állhat. Minden szegmens nyelvi mondatok gyűjteményét tartalmazza, amelyek mindegyike külön programkódsort foglal el.

Az összeszerelési nyilatkozatoknak négy típusa van:

parancsok vagy utasítások, amelyek a gépi utasítások szimbolikus megfelelői. A fordítási folyamat során az összeállítási utasításokat a mikroprocesszor utasításkészletének megfelelő parancsaivá alakítják;

makróparancsok - a programszöveg olyan mondatai, amelyeket bizonyos módon terveztek, és a fordítás során más mondatok helyettesítik őket;

direktívák, amelyek valamilyen művelet végrehajtására utasítják az assembler fordítót. Az irányelveknek nincs megfelelőjük a gépi ábrázolásban;

bármilyen karaktert tartalmazó megjegyzéssorok, beleértve az orosz ábécé betűit is. A megjegyzéseket a fordító figyelmen kívül hagyja.

^ Assembly nyelvi szintaxis

A programot alkotó mondatok lehetnek parancsnak, makrónak, direktívának vagy megjegyzésnek megfelelő szintaktikai konstrukciók. Ahhoz, hogy az assembler fordító felismerje őket, bizonyos szintaktikai szabályok szerint kell őket kialakítani. Ehhez a legjobb a nyelv szintaxisának formális leírását használni, például a nyelvtani szabályokat. A programozási nyelvek ilyen módon történő leírásának leggyakoribb módjai a szintaktikai diagramok és a kiterjesztett Backus-Naur űrlapok. A gyakorlati használatra a szintaktikai diagramok kényelmesebbek. Például az assembly nyelvi utasítások szintaxisa leírható a következő ábrákon látható szintaxisdiagramok segítségével.

Rizs. 5. Assembler mondatformátum

Rizs. 6. Formázza az utasításokat

Rizs. 7. Parancsok és makrók formátuma

Ezeken a rajzokon:

címkenév - egy azonosító, amelynek értéke az általa jelölt programforráskód mondat első bájtjának címe;

name - egy azonosító, amely megkülönbözteti ezt a direktívát a többi azonos nevű direktívától. Egy bizonyos direktíva összeállító általi feldolgozása eredményeként ehhez a névhez bizonyos jellemzők rendelhetők;

műveleti kód (COP) és direktíva a megfelelő gépi utasítás, makróutasítás vagy fordítói direktíva mnemonikus megnevezése;

operandusok - a parancs, makró vagy assembler direktívák részei, amelyek olyan objektumokat jelölnek, amelyeken műveleteket hajtanak végre. Az összeállító operandusokat numerikus és szöveges konstansokat tartalmazó kifejezések, változócímkék és műveleti jeleket és néhány fenntartott szót használó azonosítók írják le.

^ Hogyan kell használni a szintaktikai diagramokat? Nagyon egyszerű: nem kell mást tennie, mint megkeresni, majd követni az utat a diagram bemenetétől (balra) a kimenetéig (jobbra). Ha létezik ilyen út, akkor a mondat vagy szerkezet szintaktikailag helyes. Ha nincs ilyen útvonal, akkor a fordító nem fogadja el ezt a konstrukciót. A szintaktikai diagramokkal való munka során ügyeljen a nyilakkal jelölt bypass irányára, mivel az utak között lehetnek jobbról balra követhető utak. Valójában a szintaktikai diagramok a fordító logikáját tükrözik a program bemeneti mondatainak elemzésekor.

A programok szövegének írásakor megengedett karakterek:

Minden latin betű: A-Z, a-z. Ebben az esetben a nagy- és kisbetűket egyenértékűnek tekintjük;

Számok 0-tól 9-ig;

Jelek?, @, $, _, &;

Elválasztók, . ()< > { } + / * % ! " " ? \ = # ^.

Az összeállító mondatok lexémákból jönnek létre, amelyek szintaktikailag elválaszthatatlan nyelvi szimbólumok sorozatai, amelyek értelmet adnak a fordító számára.

A tokenek a következők:

Az azonosítók érvényes karaktersorozatok, amelyeket programobjektumok, például műveleti kódok, változónevek és címkenevek kijelölésére használnak. Az azonosítók írásának szabálya a következő: egy azonosító egy vagy több karakterből állhat. Karakterként használhatja a latin ábécé betűit, számokat és néhányat különleges jelek- _, ?, $, @. Az azonosító nem kezdődhet számjegy karakterrel. Az azonosító hossza legfeljebb 255 karakter lehet, bár a fordító csak az első 32 karaktert fogadja el, a többit figyelmen kívül hagyja. Az opció segítségével beállíthatja a lehetséges azonosítók hosszát parancs sor mv. Ezenkívül meg lehet mondani a fordítónak, hogy tegyen különbséget a kis- és nagybetűk között, vagy hagyja figyelmen kívül a különbséget (ami alapértelmezés szerint megtörténik).

^ Assembly nyelvi parancsok.

Az Assembler parancsok lehetőséget adnak követelményeik számítógépre történő átvitelére, a programban a vezérlés (hurkok és ugrások) átvitelének mechanizmusára a logikai összehasonlítások és a programszervezés érdekében. A programozási feladatok azonban ritkán ilyen egyszerűek. A legtöbb program ciklusok sorozatát tartalmazza, amelyekben több utasítás ismétlődik, amíg el nem ér egy bizonyos követelményt, és különféle ellenőrzéseket tartalmaz annak meghatározására, hogy a számos művelet közül melyiket kell végrehajtani. Egyes parancsok átadhatják a vezérlést a normál lépések sorrendjének megváltoztatásával az eltolás értékének közvetlen módosításával a parancsmutatóban. Mint korábban említettük, különböző parancsok léteznek a különböző processzorokhoz, de néhány parancsot figyelembe veszünk a 80186, 80286 és 80386 processzorokhoz.

A zászlók állapotának leírásához egy bizonyos parancs végrehajtása után a táblából egy válogatást használunk, amely tükrözi a zászlók jelzőregiszterének szerkezetét:

A táblázat alsó sora felsorolja a jelzők értékeit a parancs végrehajtása után. Ebben az esetben a következő jelöléseket használjuk:

1 - a parancs végrehajtása után a zászló be van állítva (egyenlő 1-gyel);

0 - a parancs végrehajtása után a zászló visszaáll (0-val egyenlő);

r - a zászló értéke a parancs eredményétől függ;

A parancs végrehajtása után a zászló definiálatlan;

szóköz - a parancs végrehajtása után a zászló nem változik;

A következő jelölést használják az operandusok ábrázolására szintaktikai diagramokban:

r8, r16, r32 - operandus a bájt, szó vagy duplaszó méretű regiszterek egyikében;

m8, m16, m32, m48 - operandus a memória méretében byte, szó, dupla szó vagy 48 bit;

i8, i16, i32 - bájt, szó vagy dupla szó méretű azonnali operandusa;

a8, a16, a32 - relatív cím (eltolás) a kódszegmensben.

Parancsok (ábécé sorrendben):

*Ezek a parancsok részletesen le vannak írva.

HOZZÁAD
(Kiegészítés)

Kiegészítés

^ A parancs vázlata:

rendeltetési hely, forrás hozzáadása

Cél: két bájt-, szó- vagy duplaszó méretű forrás- és céloperandus hozzáadása.

Munka algoritmus:

adja hozzá a forrás és a cél operandust;

írja be az összeadás eredményét a vevőbe;

állítsa be a zászlókat.

A zászlók állapota a parancs végrehajtása után:

Alkalmazás:
Az add parancs két egész operandus hozzáadására szolgál. Az összeadás eredménye az első operandus címére kerül. Ha az összeadás eredménye túllép a cél operandus határain (túlcsordulás történik), akkor ezt a helyzetet a cf flag elemzésével, majd esetleg az adc paranccsal kell figyelembe venni. Például adjuk hozzá az ax regiszter és a ch memóriaterület értékeit. Hozzáadáskor figyelembe kell venni a túlcsordulás lehetőségét.

Regisztráció plusz regiszter vagy memória:

|000000dw|modregr/rm|

Regiszter AX (AL) plusz azonnali érték:

|0000010w|--data--|adat, ha w=1|

Regiszter vagy memória plusz azonnali érték:

|100000sw|mod000r/m|--data--|adat, ha BW=01|

HÍVÁS
(HÍVÁS)

Eljárás vagy feladat hívása

^ A parancs vázlata:

Célja:

az irányítás átadása egy közeli vagy távoli eljárásra a visszatérési pont címének a veremben való tárolásával;

feladatváltás.

Munka algoritmus:
az operandus típusa határozza meg:

A címke közel van - az eip / ip parancsmutató tartalma a verembe kerül, és a címkének megfelelő új címérték betöltődik ugyanabba a regiszterbe;

Távoli címke - az eip/ip és a cs parancsmutató tartalma a verembe kerül. Ezután a távoli jelnek megfelelő új címértékek betöltődnek ugyanazokba a regiszterekbe;

R16, 32 vagy m16, 32 - definiáljon egy regisztert vagy memóriacellát, amely eltolásokat tartalmaz az aktuális utasításszegmensben, ahová a vezérlést átadják. A vezérlés átadásakor az eip/ip parancsmutató tartalma a verembe kerül;

Memóriamutató - meghatároz egy memóriahelyet, amely egy 4 vagy 6 bájtos mutatót tartalmaz a meghívott eljáráshoz. Egy ilyen mutató szerkezete 2+2 vagy 2+4 bájt. Az ilyen mutató értelmezése a mikroprocesszor működési módjától függ:

^ Jelzők állapota a parancs végrehajtása után (kivéve a feladatkapcsolót):

parancs végrehajtása nincs hatással a zászlókra

Ha egy feladatot vált, a jelzők értékei a váltott feladat TSS állapot szegmensében lévő zászlók regiszter információinak megfelelően módosulnak.
Alkalmazás:
A hívási parancs lehetővé teszi a vezérlés rugalmas és többváltozós átvitelének megszervezését egy szubrutinnak a visszatérési pont címének megőrzése mellett.

Objektumkód (négy formátum):

Közvetlen címzés egy szegmensben:

|11101000|disp-low|diep-high|

Közvetett címzés egy szegmensben:

|11111111|mod010r/m|

Közvetett címzés a szegmensek között:

|11111111|mod011r/m|

Közvetlen címzés a szegmensek között:

|10011010|offset-low|offset-magas|seg-low|seg-magas|

CMP
(hasonlítsa össze az operandusokat)

Operandus összehasonlítás

^ A parancs vázlata:

cmp operandus1, operandus2

Cél: két operandus összehasonlítása.

Munka algoritmus:

kivonás végrehajtása (operand1-operand2);

az eredménytől függően állítson be jelzőket, ne változtasson operandus1 és operandus2 (vagyis ne tárolja az eredményt).

Alkalmazás:
Ez az utasítás két operandus összehasonlítására szolgál kivonással, miközben az operandusok nem változnak. A zászlók beállítása a parancs végrehajtásának eredményeként történik. A cmp utasítást a feltételes ugrási utasításokkal és a setcc byte byte utasítással együtt használják.

Objektumkód (három formátum):

Regisztrált vagy regisztrált memória:

|001110dw|modreg/m|

Azonnali érték AX (AL) regiszterrel:

|0011110w|--data--|adat, ha w=1|

Azonnali érték regiszterrel vagy memóriával:

|100000sw|mod111r/m|--data--|adat, ha sw=0|

DECEMBER
(Az operandus csökkentése 1-gyel)

Operandus eggyel csökkentése

^ A parancs vázlata:

dec operandus

Cél: csökkentse az operandus értékét a memóriában vagy a regiszterben 1-gyel.

Munka algoritmus:
az utasítás levon 1-et az operandusból. A zászlók állapota a parancs végrehajtása után:

Alkalmazás:
A dec parancs egy bájt, szó, dupla szó értékének csökkentésére szolgál a memóriában vagy a regiszterben. Vegye figyelembe, hogy a parancs nem befolyásolja a cf jelzőt.

Regisztráció: |01001reg|

^ Regiszter vagy memória: |1111111w|mod001r/m|

DIV
(Oszt aláíratlan)

Osztály aláírás nélkül

Parancs séma:

div osztó

Cél: osztási művelet végrehajtása két bináris előjel nélküli értéken.

^ Munka algoritmus:
A parancshoz két operandusra van szükség - az osztóra és az osztóra. Az osztalékot implicit módon adjuk meg, mérete pedig a parancsban megadott osztó méretétől függ:

ha az osztó bájtban van, akkor az osztaléknak az ax regiszterben kell lennie. A művelet után a hányadost al-ba, a maradékot ah-ba helyezzük;

ha az osztó szó, akkor az osztaléknak a dx:ax regiszterpárban kell elhelyezkednie, az osztalék alsó részének pedig ax-ben kell lennie. A művelet után a hányadost ax-ba, a maradékot dx-be helyezzük;

ha az osztó kettős szó, akkor az osztaléknak az edx:eax regiszterpárban kell elhelyezkednie, az osztalék alsó része pedig az eax-ben. A művelet után a hányadost az eax-be, a maradékot pedig az edx-be helyezzük.

^ A zászlók állapota a parancs végrehajtása után:

Alkalmazás:
A parancs az operandusok egész számmal történő felosztását hajtja végre, visszaadva az osztás eredményét hányadosként és az osztás maradékát. Osztási művelet végrehajtásakor kivétel előfordulhat: 0 - osztási hiba. Ez a helyzet két esetben fordul elő: az osztó 0, vagy a hányados túl nagy ahhoz, hogy beleférjen az eax/ax/al regiszterbe.

Objektumkód:

|1111011w|mod110r/m|

INT
(Megszakítás)

Megszakítási szolgáltatási rutin hívása

^ A parancs vázlata:

int megszakítási_szám

Cél: a megszakítási szolgáltatási rutin hívása az utasítás operandusa által meghatározott megszakítási számmal.

^ Munka algoritmus:

tolja a zászlók/zászlók regisztert és a visszaküldési címet a verembe. A visszatérési cím írásakor először a cs szegmensregiszter tartalma kerül kiírásra, majd az eip/ip parancsmutató tartalma;

állítsa vissza az if és tf jelzőket nullára;

segítségével adja át a vezérlést a megszakításkezelőnek megadott szám. A vezérlés átviteli mechanizmusa a mikroprocesszor működési módjától függ.

^ A zászlók állapota a parancs végrehajtása után:

Alkalmazás:
Amint a szintaxisból látható, ennek a parancsnak két formája van:

int 3 - saját, 0cch műveleti kóddal rendelkezik, és egy bájtot foglal el. Ez a körülmény nagyon kényelmessé teszi a különféle szoftveres hibakeresőkben történő használatát a töréspontok beállítására bármely utasítás első bájtjának lecserélésével. A mikroprocesszor a parancsok sorrendjében egy 0cch műveleti kóddal rendelkező paranccsal találkozik, és a 3-as számú vektorral meghívja a megszakításkezelőt, amely a szoftverhibakeresővel való kommunikációra szolgál.

Az utasítás második formája két bájt hosszú, működési kódja 0cdh, és lehetővé teszi, hogy hívást kezdeményezzen egy megszakítási szolgáltatási rutinhoz, amelynek vektorszáma 0 és 255 között van. A vezérlés átadásának jellemzői, amint megjegyeztük, a mikroprocesszor működési módjától függenek.

Objektumkód (két formátum):

Regisztráció: |01000reg|

^ Regiszter vagy memória: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Ugrás, ha állapot)

(Ugrás, ha CX=nulla/ Ugrás, ha ECX=nulla)

Ugrás, ha a feltétel teljesül

Ugrás, ha a CX/ECX nulla

^ A parancs vázlata:

jcc címkét
jcxz címke
jecxz címke

Cél: átmenet az aktuális parancsszegmensen belül, bizonyos feltételektől függően.

^ Parancsalgoritmus (a jcxz/jecxz kivételével):
A jelzők állapotának ellenőrzése a műveleti kódtól függően (az ellenőrzött állapotot tükrözi):

ha a tesztelt feltétel igaz, akkor lépjen az operandus által jelzett cellába;

ha az ellenőrzött feltétel hamis, akkor adja át a vezérlést a következő parancsnak.

jcxz/jecxz parancsalgoritmus:
Annak feltételének ellenőrzése, hogy az ecx/cx regiszter tartalma nulla:

ha az ellenőrzött állapot