Program assembly nyelven. Az IBM-PC Assembler nyelv parancsrendszerének általános jellemzői (alapparancskészlet, operandusok címzésének alapvető módszerei). Programstruktúra Assembler nyelven. Assembly nyelvi parancsok

Általános információ az assembly nyelvről

A szimbolikus assembly nyelv nagyrészt kiküszöbölheti a gépi nyelvű programozás hátrányait.

Fő előnye, hogy assembly nyelven minden programelem szimbolikus formában jelenik meg. A szimbolikus parancsnevek bináris kódjukká konvertálása a felelős speciális program- assembler, amely megszabadítja a programozót a munkaigényes munkától és kiküszöböli az elkerülhetetlen hibákat.

Az assembly nyelvű programozás során beírt szimbolikus nevek általában a program szemantikáját tükrözik, a parancsok rövidítése pedig a fő funkciójukat. Például: PARAM - paraméter, TABLE - táblázat, MASK - maszk, ADD - összeadás, SUB - kivonás stb. stb. Az ilyen neveket a programozó könnyen megjegyezheti.

Az assembly nyelvű programozáshoz összetettebb eszközök szükségesek, mint a gépi nyelvű programozáshoz: mikroszámítógépen vagy készlettel ellátott PC-n alapuló számítógépes rendszerekre van szükség. perifériás eszközök(alfanumerikus billentyűzet, karakteres kijelző, float meghajtó és nyomtató eszköz), valamint rezidens vagy keresztprogramozási rendszerek a szükséges típusú mikroprocesszorokhoz. Az Assembly nyelv lehetővé teszi a gépi nyelvnél jóval összetettebb programok hatékony írását és hibakeresését (1-4 KB-ig).

Az összeállítási nyelvek géporientáltak, azaz a megfelelő mikroprocesszor gépi nyelvétől és szerkezetétől függenek, mivel bennük minden mikroprocesszor utasításhoz egy adott szimbolikus név van hozzárendelve.

Az összeállítási nyelvek jelentős növekedést biztosítanak a programozói termelékenységben a gépi nyelvekhez képest, és ugyanakkor megtartják a mikroprocesszor összes szoftveresen elérhető hardver erőforrásának használatát. Ez lehetővé teszi a képzett programozók számára, hogy olyan programokat írjanak, amelyek rövidebb idő alatt végrehajthatók egy kis időés kevesebb memóriát foglalnak a magas szintű nyelven létrehozott programokhoz képest.

Ebben a tekintetben szinte minden bemeneti/kimeneti eszközök (illesztőprogramok) vezérlésére szolgáló program assembly nyelven íródott, annak ellenére, hogy a magas szintű nyelvek meglehetősen nagy választéka található.

Az assembly nyelv használatával a programozó a következő paramétereket állíthatja be:

az egyes mikroprocesszoros gépi nyelvi parancsok mnemonikája (szimbolikus neve);

szabványos formátum egy assembly nyelven írt program soraihoz;

formátum a jelzéshez különféle módokon címzési és parancsváltozatok;

formátum karakterkonstansok és egész szám állandók megadására különböző számrendszerekben;

pszeudo-parancsok, amelyek a program összeállításának (fordításának) folyamatát irányítják.

Az assembly nyelvben a program soronként íródik, vagyis minden parancshoz egy sor van lefoglalva.

A legelterjedtebb típusú mikroprocesszorokra épülő mikroszámítógépeknél az assembly nyelvnek több változata is létezhet, de általában egyet alkalmaznak széles körben a gyakorlatban - ez az úgynevezett standard assembly nyelv.

A gépi utasítás szintű programozás az a minimális szint, amelyen programokat lehet írni. A gépi utasítások rendszerének elegendőnek kell lennie a szükséges műveletek végrehajtásához a számítógép hardverének utasításokkal.

Minden gépi parancs két részből áll:

· műtő – a „mit tegyünk” meghatározása;

· operandus - feldolgozó objektumok meghatározása, „mihez kezdjünk”.

Az assembly nyelven írt mikroprocesszoros gépparancs egy sor a következő szintaktikai formában:

címke parancs/irányító operandus(ok) ;megjegyzések

Ebben az esetben a sorban kötelező mező egy parancs vagy utasítás.

A címkét, a parancsot/direktívát és az operandusokat (ha vannak) legalább egy szóköz vagy tabulátor karakter választja el.

Ha egy parancsot vagy 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 assembly nyelv nem tesz különbséget a kis- és nagybetűk között a parancsok vagy direktívák írásakor.

Közvetlen címzés: A tényleges címet közvetlenül a gépi utasítás offset mezője határozza meg, amely 8, 16 vagy 32 bites lehet.

mov eax, sum ; eax = összeg

Az assembler lecseréli az összeget az adatszegmensben tárolt megfelelő címre (alapértelmezés szerint a ds regiszter címezi), és az összegben tárolt értéket az eax regiszterbe helyezi.

Közvetett címzés viszont a következő típusokkal rendelkezik:

· közvetett alap (nyilvántartási) címzés;

· indirekt alap (regiszter) címzés offszettel;

· közvetett indexcímzés;

· közvetett alapvető indexcímzés.

Közvetett alap (regiszter) címzés. Ezzel a címzéssel az operandus effektív címe bármelyik általános célú regiszterben megtalálható, kivéve az sp/esp és a bp/ebp (ezek speciális regiszterek a verem szegmenssel való munkához). Szintaktikailag egy parancsban ez a címzési mód a regiszter nevének szögletes zárójelekbe helyezésével fejeződik ki.

mov eax, ; eax = *esi; *esi érték az esi címen

Bevezetés.

Azt a nyelvet, amelyen a forrásprogram meg van írva, hívjuk bejárat nyelv, és az a nyelv, amelyre a processzor végrehajtásához lefordítja szabadnapokon nyelv. A beviteli nyelv kimeneti nyelvvé alakításának folyamatát ún adás. Mivel a processzorok a programozáshoz nem használt bináris gépi nyelven is képesek programokat végrehajtani, ezért az összes forrásprogram fordítása szükséges. Ismert két út adások: összeállítás és tolmácsolás.

Nál nél összeállítás a forrásprogramot először teljesen lefordítják egy ekvivalens programra a kimeneti nyelven, ún tárgy programot, majd végrehajtjuk. Ezt a folyamatot speciális segítségével hajtják végre programok, hívott fordítóprogram. Egy olyan fordítót, amelynél a bemeneti nyelv a bináris kódok gépi (kimeneti) nyelvének szimbolikus formája, ún. szerelő.

Nál nél értelmezések A forrásprogram minden szövegsorát elemzi (értelmezi), és azonnal végrehajtja a benne megadott parancsot. Ennek a módszernek a végrehajtása rá van bízva tolmács program. Az értelmezés sokáig tart. A hatékonyság növelése érdekében az egyes sorok feldolgozása helyett a tolmács először az összeset konvertálja csapat karakterláncok (

). A generált szimbólumsorozat az eredeti programhoz rendelt funkciók végrehajtására szolgál.

Az alábbiakban tárgyalt összeállítási nyelv fordítással valósul meg.

A nyelv jellemzői.

Az összeszerelő főbb jellemzői:

● bináris kódok helyett a nyelv szimbolikus neveket használ - mnemonika. Például az összeadás parancshoz (

) mnemonikát használnak

Kivonások (

szorzás (

osztályok (

stb. A szimbolikus neveket a memóriacellák megcímzésére is használják. Az assembly nyelvű programozáshoz a bináris kódok és címek helyett csak szimbolikus neveket kell ismerni, amelyeket az assembler bináris kódokká fordít le;

minden állítás megfelel egy gépparancs(kód), azaz van egy-egy megfelelés a gépi parancsok és az operátorok között egy assembly nyelvi programban;

● a nyelv hozzáférést biztosít minden tárgyraés csapatok. A magas szintű nyelvek nem rendelkeznek ezzel a képességgel. Például az assembly nyelv lehetővé teszi a jelzőregiszter biteinek ellenőrzését és a magas szintű nyelv (pl.

) nem rendelkezik ezzel a képességgel. Vegye figyelembe, hogy a rendszerprogramozási nyelvek (például C) gyakran köztes pozíciót foglalnak el. Hozzáférhetőség szempontjából közelebb állnak az assembly nyelvhez, de egy magas szintű nyelv szintaxisával rendelkeznek;

● assembly nyelv nem univerzális nyelv. A mikroprocesszorok minden egyes csoportjának saját összeszerelője van. A magas szintű nyelveknek nincs ilyen hátránya.

A magas szintű nyelvekkel ellentétben a programok assembly nyelven történő megírása és hibakeresése sok időt vesz igénybe. Ennek ellenére az assembly nyelvet megkapta széleskörű felhasználás a következő körülmények miatt:

● egy assembly nyelven írt program lényegesen kisebb méretű és sokkal gyorsabban fut, mint egy magas szintű nyelven írt program. Egyes alkalmazásoknál ezek a mutatók elsődleges szerepet játszanak, például számos rendszerprogram (beleértve a fordítókat), hitelkártya-programok, mobiltelefonok, eszközillesztőprogramok stb.;

● egyes eljárások megkövetelik teljes hozzáférés a hardverhez, ami általában lehetetlen magas szintű nyelven. Ez az eset magában foglalja a megszakításokat és megszakításkezelőket az operációs rendszerekben, valamint az eszközvezérlőket a beágyazott valós idejű rendszerekben.

A legtöbb programban a teljes kódnak csak egy kis százaléka felelős a program végrehajtási idejének nagy százalékáért. Jellemzően a program 1%-a felelős a végrehajtási idő 50%-áért, és a program 10%-a a végrehajtási idő 90%-áért. Ezért egy adott program valós körülmények közötti írásához mind az assembler, mind a magas szintű nyelvek egyikét használják.

Operátori formátum assembly nyelven.

Az assembly nyelvű program parancsok (utasítások, mondatok) listája, amelyek mindegyike külön sort foglal el, és négy mezőt tartalmaz: egy címkemezőt, egy műveleti mezőt, egy operandusmezőt és egy megjegyzésmezőt. Minden mezőnek külön oszlopa van.

Címke mező.

Az 1. oszlop a címkemezőhöz van hozzárendelve. A címke szimbolikus név vagy azonosító, címek memória. Ez szükséges ahhoz, hogy:

● feltételes vagy feltétel nélküli áttérés a parancsra;

● hozzáférhet az adatok tárolási helyéhez.

Az ilyen nyilatkozatokat címkével látják el. A név jelzésére az angol ábécé (nagy) betűit és számokat használjuk. A név elején betűnek, a végén kettőspont elválasztónak kell lennie. A kettőspont címke külön sorba, a műveleti kód pedig a 2. oszlop következő sorába írható, ami leegyszerűsíti a fordító munkáját. A kettőspont hiánya nem teszi lehetővé a címke és a műveleti kód megkülönböztetését, ha azok külön sorokban helyezkednek el.

Az assembly nyelv egyes verzióiban a kettőspont csak az utasításcímkék után kerül elhelyezésre, az adatcímkék után nem, és a címke hossza 6 vagy 8 karakterre korlátozódhat.

A címkemezőben nem lehetnek azonos nevek, mivel a címke parancscímekhez van társítva. Ha a program végrehajtása során nem kell parancsot vagy adatot hívni a memóriából, akkor a címkemező üresen marad.

Műveleti kód mező.

Ez a mező egy parancs vagy pszeudo-parancs emlékeztető kódját tartalmazza (lásd alább). A parancs mnemonikus kódját a nyelvfejlesztők választják ki. Assembly nyelven

A mnemonika van kiválasztva egy regiszter memóriából való betöltéséhez

), és a regiszter tartalmának a memóriába mentéséhez - egy emlékeztető

). assembly nyelveken

mindkét művelethez használhatja ugyanazt a nevet, ill

Ha a mnemonikus nevek kiválasztása tetszőleges lehet, akkor a két gépi utasítás használatának szükségességét a processzor architektúrája határozza meg

A regiszterek mnemonikája az assembler verziótól is függ (5.2.1. táblázat).

Operandus mező.

Itt található további információ, szükséges a művelet elvégzéséhez. Az ugrásparancsok operandusmezőjében megjelenik az a cím, amelyre az ugrást végrehajtani kell, valamint azok a címek és regiszterek, amelyek a gépi parancs operandusai. Példaként 8 bites processzorokhoz használható operandusokat adunk

● számszerű adatok,

különböző számrendszerekben mutatják be. A használt számrendszer jelzésére a konstanst az egyik követi Latin betűk: BAN BEN,

Ennek megfelelően bináris, oktális, hexadecimális, decimális számrendszerek (

nem kell leírnod). Ha egy hexadecimális szám első számjegye A, B, C,

Ezután egy jelentéktelen 0-t (nulla) adunk hozzá;

● belső mikroprocesszor-regiszterek és memóriacellák kódjai

M (információs források vagy fogadók) A, B, C betűk formájában,

M vagy címük bármilyen számrendszerben (például 10B - nyilvántartási cím

bináris rendszerben);

● azonosítók,

repülőgép-nyilvántartási párok esetében,

Az első betűk B,

N; egy pár akkumulátorhoz és szolgáltatásregiszterhez -

; a programszámlálóhoz -

;a veremmutatóhoz -

● címkék, amelyek az operandusok címét vagy a következő utasításokat jelzik a feltételes feltételben

(ha a feltétel teljesül) és feltétlen átmenetek. Például az M1 operandus a parancsban

a parancsra való feltétel nélküli átállás szükségességét jelenti, amelynek címe a címkemezőben M1 azonosítóval van jelölve;

● kifejezések,

amelyeket a fent tárgyalt adatok összekapcsolásával aritmetikai és logikai operátorok segítségével szerkesztünk. Vegye figyelembe, hogy az adatterület lefoglalásának módja a nyelvi verziótól függ. Assembly nyelvi fejlesztők számára

Határozza meg a szót), majd később írja be Alternatív lehetőség.

amely a kezdetektől fogva a processzorok nyelvén volt

Nyelvi változatban

használt

Állandó meghatározása).

A processzorok különböző hosszúságú operandusokat dolgoznak fel. Ennek meghatározásához az assembler fejlesztők különböző döntéseket hoztak, például:

A különböző hosszúságú II regiszterek különböző nevekkel rendelkeznek: EAX - 32 bites operandusok elhelyezésére (típus

); AX - 16 biteshez (típus

és AN - 8 biteshez (típus

● processzorokhoz

Minden műveleti kódhoz utótagok kerülnek: utótag

A típushoz

; ".B" utótag a típushoz

különböző műveleti kódokat használnak a különböző hosszúságú operandusokhoz, például egy bájt, félszó (

) és a szavakat egy 64 bites regiszterbe opkódok segítségével

illetőleg.

Megjegyzés mező.

Ez a mező magyarázatokat ad a program műveleteiről. A megjegyzések nem befolyásolják a program működését, és embereknek szólnak. Szükség lehet rájuk egy program módosításához, ami ilyen megjegyzések nélkül még a tapasztalt programozók számára is teljesen érthetetlen lehet. A megjegyzés szimbólummal kezdődik, és a programok magyarázatára és dokumentálására szolgál. A megjegyzés kezdő karaktere lehet:

● pontosvessző (;) a vállalat feldolgozóinak nyelvein

Felkiáltójel(!) nyelveken for

Minden külön megjegyzéssort egy vezető karakter előz meg.

Pszeudo-parancsok (irányelvek).

Az assembly nyelvben a parancsoknak két fő típusa van:

alapvető utasításokat, amelyek megfelelnek a processzor gépi kódjának. Ezek a parancsok végrehajtják a program által tervezett összes feldolgozást;

álparancsok vagy irányelvek, A program kódkombinációs nyelvre történő fordítási folyamatának kiszolgálására készült. Példaként a táblázatban. Az 5.2.2 néhány pszeudo-parancsot mutat be az assemblertől

a családnak

.

A programozás során vannak olyan helyzetek, amikor az algoritmus szerint ugyanazt a parancsláncot kell sokszor megismételni. A helyzetből való kilábalás érdekében:

● írja be a szükséges parancssort, amikor megjelenik. Ez a megközelítés a program volumenének növekedéséhez vezet;

● rendezze ezt a szekvenciát eljárásba (szubrutinba), és szükség esetén hívja meg. Ennek a kimenetnek megvannak a maga hátrányai: minden alkalommal, amikor egy speciális eljáráshívás parancsot és egy return parancsot kell végrehajtani, amelyek rövid és gyakran használt szekvencia esetén nagymértékben csökkenthetik a program sebességét.

A legegyszerűbb és hatékony módszer egy parancslánc ismételt megismétlése abból áll, hogy használjuk makró, amely egy pszeudo-parancsként ábrázolható, amely egy programban gyakran megtalálható parancscsoport újrafordítására szolgál.

A makrót vagy makroparancsot három szempont jellemzi: makrodefiníció, makroinverzió és makrokiterjesztés.

Makró definíció

Ez a programparancsok ismétlődő sorozatának megjelölése, amelyet a program szövegében található hivatkozásokhoz használnak.

A makródefiníció a következő szerkezettel rendelkezik:

Kifejezések listája; Makró definíció

A makrodefiníció adott szerkezetében három rész különíthető el:

● cím

makró, beleértve a nevet

Pszeudo-parancs

és egy sor paramétert;

● pontokkal jelölve test makró;

● csapat

érettségi

makró definíciók.

A makródefiníciós paraméterkészlet tartalmazza a kiválasztott utasításcsoport operandusmezőjében megadott összes paraméter listáját. Ha ezeket a paramétereket korábban megadtuk a programban, akkor ezeket nem kell feltüntetni a makródefiníciós fejlécben.

A kiválasztott parancscsoport összeállításához a névből álló fellebbezést használjuk

makróparancsok és a paraméterek listája más értékekkel.

Amikor az assembler makródefinícióval találkozik a fordítási folyamat során, eltárolja azt a makródefiníciós táblában. A név későbbi megjelenésekor a programban (

) egy makró esetében, az assembler lecseréli a makró törzsére.

A makrónév műveleti kódként történő használata meghívásra kerül makro-visszafordítás(makróhívás), és lecserélve a makró törzsére - makro bővítés.

Ha egy program karakterek sorozataként van ábrázolva (betűk, számok, szóközök, írásjelek és kocsivisszalépések új sorba lépéshez), akkor a makróbővítés abból áll, hogy ebből a sorozatból néhány láncot más láncokkal helyettesít.

A makró bővítése az összeállítási folyamat során történik, nem a program végrehajtása során. A karakterláncok manipulálására szolgáló módszerek hozzá vannak rendelve makró azt jelenti.

Az összeszerelési folyamat megtörténik két menetben:

● Az első lépésben minden makródefiníció megmarad, és a makróhívások kibővülnek. Ebben az esetben az eredeti programot beolvassa és olyan programmá alakítja, amelyben az összes makródefiníciót eltávolítják, és minden makróhívást a makró törzsével helyettesítenek;

● a második lépés makrók nélkül dolgozza fel az eredményül kapott programot.

Makrók paraméterekkel.

Az ismétlődő parancssorozatokkal való munkához, amelyek paraméterei különböző értékeket vehetnek fel, makródefiníciók állnak rendelkezésre:

● -val tényleges paraméterek, amelyek a makróhívás operandusmezőjébe kerülnek;

● -val hivatalos paramétereket. A makróbővítés során minden, a makró törzsében megjelenő formális paramétert a megfelelő aktuális paraméterrel helyettesítünk.

makrók használata paraméterekkel.

Az 1. program két hasonló parancssorozatot tartalmaz, amelyek abban különböznek, hogy az első felcseréli a P és a parancsokat

És a második

A 2. program tartalmaz egy makrót két formális P1 és P2 paraméterrel. A makróbővítés során a makrótörzsben minden P1 karaktert az első aktuális paraméterrel (P,

), és a P2 szimbólum helyére a második aktuális paraméter (

) az 1. számú programból. A makróhívásban

a 2. program jelölése: P,

Az első tényleges paraméter,

Második tényleges paraméter.

1. program

2. program

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Bővített képességek.

Nézzünk meg néhány speciális nyelvi funkciót

Ha egy feltételes ugrásparancsot és egy ugrandó címkét tartalmazó makrót kétszer vagy többször hívnak meg, akkor a címke megkettőződik (címke duplikálási probléma), ami hibát okoz. Ezért minden hívás külön címkét rendel paraméterként (a programozó által). A nyelvben

a címke helyinek minősül (

) és a fejlett képességeknek köszönhetően az assembler automatikusan más címkét generál a makró minden egyes kibontásakor.

lehetővé teszi makrók meghatározását más makrókon belül. Ez a speciális funkció nagyon hasznos egy program feltételes összekapcsolásával kombinálva. Mérlegeljük

IF WORDSIZE GT 16 M2 MAKRO

Az M2 makró az utasítás mindkét részében definiálható

A meghatározás azonban attól függ, hogy a program melyik processzorra van összeállítva: 16 bites vagy 32 bites. Ha az M1 nem kerül meghívásra, akkor az M2 makró egyáltalán nem lesz meghatározva.

Egy másik fejlett funkció, hogy a makrók más makrókat is hívhatnak, beleértve önmagukat is. rekurzív hívás. Ez utóbbi esetben a végtelen ciklus elkerülése érdekében a makrónak át kell adnia magának egy paramétert, amely minden bővítéssel változik, és jelölje be ezt a paramétert, és akkor fejezze be a rekurziót, amikor a paraméter elér egy bizonyos értéket.

A makró eszközök használatáról az assemblerben.

Makró használatakor az assemblernek képesnek kell lennie két funkció végrehajtására: mentse a makródefiníciókatÉs kiterjeszteni a makro kihívásokat.

Makródefiníciók mentése.

Minden makrónév egy táblázatban tárolódik. Minden névhez tartozik egy mutató a megfelelő makróra, hogy szükség esetén hívható legyen. Egyes assemblerek külön táblázattal rendelkeznek a makrónevek számára, másoknak van egy általános táblája, amelyben a makrónevek mellett minden géputasítás és direktíva található.

Ha összeállítás közben makróval találkozik létrehozva:

új táblázatelem a makró nevével, a paraméterek számával és egy másik makródefiníciós táblára mutató mutatóval, ahol a makró törzse kerül tárolásra;

● lista hivatalos paramétereket.

A makró törzsét, amely egyszerűen egy karaktersorozat, a rendszer ezután beolvassa és a makródefiníciós táblázatban tárolja. A ciklus törzsében előforduló formális paraméterek meg vannak jelölve különleges karakter.

Egy makró belső ábrázolása

a fenti példából a 2. programhoz (244. oldal) a következő:

MOV EAX, MOV EBX, MOV MOV &

ahol a pontosvesszőt kocsivisszaadási karakterként, az & jelet pedig formális paraméterkarakterként használják.

Makróhívások kiterjesztése.

Ha az összeállítás során makródefinícióval találkozunk, az a makrótáblában tárolódik. Makró meghívásakor az assembler ideiglenesen leállítja a bemeneti adatok beolvasását a beviteli eszközről, és elkezdi olvasni a tárolt makró törzsét. A makrótörzsből kinyert formális paramétereket tényleges paraméterek váltják fel, és a hívás biztosítja. Az "és" és az előtte paraméterek lehetővé teszik az összeszerelő számára, hogy felismerje őket.

Annak ellenére, hogy az assemblernek számos változata létezik, az összeszerelési folyamatok közös jellemzőkkel rendelkeznek, és sok tekintetben hasonlóak. A két menetes assembler működését az alábbiakban tárgyaljuk.

Kétmenetes szerelő.

Egy program több utasításból áll. Ezért úgy tűnik, hogy összeszereléskor a következő műveletsort használhatja:

● lefordítani gépi nyelvre;

● az így kapott gépi kódot egy fájlba, a lista megfelelő részét pedig egy másik fájlba vigye át;

● ismételje meg a felsorolt ​​eljárásokat, amíg a teljes programot le nem fordítja.

Ez a megközelítés azonban nem hatékony. Példa erre az úgynevezett probléma továbbító link. Ha az első utasítás egy ugrás a P utasításra, amely a program legvégén található, akkor az assembler nem tudja lefordítani. Először meg kell határoznia a P operátor címét, és ehhez be kell olvasnia a teljes programot. A forrásprogram minden teljes olvasása meghívásra kerül átjáró, átkelés. Mutatjuk, hogyan oldhatja meg az előretekintő link problémát két lépéssel:

az első menetben kellene gyűjtés tárolja az összes szimbólumdefiníciót (beleértve a címkéket is) a táblázatban, majd a második lépésben olvassa el és állítsa össze az egyes operátorokat. Ez a módszer viszonylag egyszerű, de az eredeti programon való második áthaladás több időt igényel az I/O műveletekkel;

● az első menetben kell alakítani a programot egy köztes formába és mentsük el egy táblázatba, a második lépést pedig ne az eredeti program, hanem a táblázat szerint hajtsuk végre. Ezzel az összeállítási módszerrel időt takaríthat meg, mivel a második lépés nem hajt végre I/O műveleteket.

Első lépés.

Első passz gól- szimbólumtáblázat építése. Ahogy fentebb megjegyeztük, az első lépés másik célja az összes makródefiníció megőrzése és a hívások megjelenése szerinti kiterjesztése. Következésképpen a szimbólumdefiníció és a makróbővítés is egy lépésben történik. A szimbólum bármelyik lehet címke, vagy jelentése, amelyhez egy adott név van hozzárendelve a -you direktívával:

;Érték - puffer mérete

Azzal, hogy a parancscímke mezőben jelentést rendel a szimbolikus nevekhez, az assembler lényegében meghatározza azokat a címeket, amelyekkel minden parancs rendelkezni fog a program végrehajtása során. Ebből a célból az összeszerelő az összeszerelési folyamat során tárolja utasítás címszámláló(

) speciális változóként. Az első lépés elején a speciális változó értéke 0-ra van állítva, és minden egyes feldolgozott parancs után növekszik a parancs hosszával. Példaként a táblázatban. Az 5.2.3 egy programrészletet mutat, amely a parancsok hosszát és a számlálóértékeket jelzi. Az első lépésben táblázatok generálódnak szimbolikus nevek, direktívákÉs működési kódok,és ha szükséges szó szerinti asztal. A literál olyan állandó, amelyre az assembler automatikusan memóriát foglal le. Azonnal jegyezzük meg, hogy a modern processzorok közvetlen címmel ellátott utasításokat tartalmaznak, így összeszerelőik nem támogatják a literálokat.

Szimbólumnév táblázat

minden névhez egy elemet tartalmaz (5.2.4. táblázat). A szimbolikus névtáblázat minden eleme tartalmazza magát a nevet (vagy egy rámutatót), annak számértékét, és néha további információkat, amelyek magukban foglalhatják:

● a szimbólumhoz tartozó adatmező hossza;

● memória újraelosztási bitek (amelyek jelzik, hogy megváltozik-e egy szimbólum értéke, ha a program az assembler által tervezetttől eltérő címre kerül betöltésre);

● információ arról, hogy a szimbólum elérhető-e az eljáráson kívülről.

A szimbolikus nevek címkék. Operátorokkal adhatók meg (pl.

Irányelv táblázat.

Ez a táblázat felsorolja az összes direktívát vagy pszeudo-parancsot, amelyekkel egy program összeállításakor találkozhatunk.

Műveleti kód táblázat.

Minden műveleti kódhoz a táblázat külön oszlopokkal rendelkezik: műveleti kód megnevezése, 1. operandus, 2. operandus, a műveleti kód hexadecimális értéke, a parancs hossza és típusa (5.2.5. táblázat). A műveleti kódok az operandusok számától és típusától függően csoportokra vannak osztva. A parancs típusa határozza meg a csoport számát, és meghatározza a csoport összes parancsának feldolgozásához meghívott eljárást.

Második menet.

A második passz gólja- objektumprogram létrehozása és szükség esetén az assembly protokoll kinyomtatása; olyan kimeneti információkat, amelyek szükségesek ahhoz, hogy a linker a különböző időpontokban összeállított eljárásokat egyetlen végrehajtható fájlba kapcsolhassa.

A második lépésben (mint az elsőben) egyenként beolvassák és feldolgozzák az utasításokat tartalmazó sorokat. Az eredeti operátor és a kimeneti operátor hexadecimálisan származtatott belőle tárgy A kód kinyomtatható vagy pufferbe helyezhető későbbi nyomtatás céljából. A parancscímszámláló nullázása után a parancs meghívásra kerül következő kijelentés.

A forrásprogram hibákat tartalmazhat, például:

az adott szimbólum nincs, vagy többször van definiálva;

● a műveleti kódot érvénytelen név írja le (elírási hiba miatt), nincs elég operandusa, vagy túl sok operandusa van;

● nincs kezelő

Egyes összeszerelők észlelhetnek egy nem definiált szimbólumot, és kicserélhetik azt. Azonban a legtöbb esetben, amikor hibaüzenettel találkozik, az összeszerelő hibaüzenetet jelenít meg a képernyőn, és megpróbálja folytatni az összeállítási folyamatot.

Az assembly nyelvnek szentelt cikkek.

2.5 témakör A processzorprogramozás alapjai

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

A szimbolikus parancskódoló nyelvet hívják szerelő.

Assembly nyelv egy olyan nyelv, amelyben minden megnyilatkozás pontosan egy gépi parancsnak felel meg.

Összeszerelé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. mikrocsapatokban. Ez a programáltalában ROM-ban található, vagy valamilyen külső adathordozóról kerül 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 utasításhoz.

A programozás alapjainak megértése géporientált nyelveken hasznos:



A PC-architektúra jobb megértése és a számítógépek kompetensebb 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 hibakeresőjében a megadott programok meghívásával és a megjelenítés összeállításban történő visszafordításával nyelv);

Programok összeállítása a legkritikusabb problémák megoldására (a géporientált nyelven írt program általában hatékonyabb - a magas szintű nyelvekről fordítás eredményeként kapott programok 30-60 százalékával rövidebb és gyorsabb)

A főprogramban szereplő eljárások külön töredékek formájában való megvalósítása abban az esetben, ha nem hajthatók végre sem a használt magas szintű nyelven, sem az operációs rendszer szolgáltatási eljárásaival.

Egy assembly nyelvű program csak egy számítógépcsaládon futhat, míg egy magas szintű nyelven írt program 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. Vannak:

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

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

A hexadecimális számok H betűvel végződnek.

RAM, regiszterek, adatmegjeleníté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 hatékonyabban használja ki egy adott gép (pontosabban egy MP) képességeit, mint egy magas szintű nyelvű program (ami programozónak egyszerűbb, mint assemblernek). Nézzük meg a géporientált nyelvek programozásának alapelveit az MP KR580VM80 assembly nyelvének példáján. A nyelven való programozáshoz általános módszertant használnak. A programok rögzítésének speciális technikai technikái a cél MP architektúrájának és parancsrendszerének jellemzőihez kapcsolódnak.

Szoftver modell MP KR580VM80 alapú mikroprocesszoros rendszer

Az MPS szoftvermodellje az 1. ábra szerint

MP portok memória

S Z A.C. P C

1. kép

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

A– 8 bites akkumulátor regiszter. Ez a képviselő 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űveletek eredményét általában az A-ban tárolják.

B, C, D, E, H, L– 8 bites általános célú regiszterek (GPR). Belső memória MP. A feldolgozott információk, valamint a művelet eredményeinek tárolására szolgál. A 16 bites szavak feldolgozása során a regiszterek BC, DE, HL párokat alkotnak, és a kettős regisztert az első betűnek nevezik - B, D, H. Egy regiszterpárban a legmagasabb az első regiszter. A H és L regiszterek egy speciális tulajdonsággal rendelkeznek, mind az adatok tárolására, mind a RAM cellák 16 bites címeinek tárolására szolgálnak.

FL– zászlóregiszter (jelregiszter) 8 bites regiszter, amelyben az MP-ben végzett aritmetikai és logikai műveletek eredményének öt előjele van tárolva. 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.

Bit P (paritás) – paritás, 1-re állítva, ha az eredmény bitjeiben az egyesek száma páros.

Az AC számjegy egy további átvitel, amelyet arra terveztek, hogy az eredmény alacsony rendű tetradjából származó átviteli értéket tárolja.

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

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

SP– veremmutató, egy 16 bites regiszter, amely annak a memóriacellának a címét tárolja, ahová a verembe utoljára beillesztett bájtot írták.

RS– programszámláló (programszámláló), egy 16 bites regiszter, amely a következő végrehajtandó 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 0000Н – 07FF cím kezdeti memóriaterületén van vezérlő programés bemutató programok. 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 adatíráshoz. (RAM).

0ВВ0 – a verem kezdőcíme. (RAM).

A verem a RAM egy speciálisan szervezett területe, amely adatok vagy címek ideiglenes tárolására szolgál. A verembe utoljára írt szám jelenik meg először. A veremmutató annak az utolsó veremcellának a címét tárolja, amelybe az információ került. 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 tartalmát a verembe menti, az alprogram végén pedig visszaállítja a veremből.

Az assembly nyelv adatformátuma és parancsszerkezete

Az MP KR580VM80 memóriája egy bájtoknak nevezett 8 bites szavakból álló tömb, 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, ami a ROM-ban és a RAM-ban is megtalálható.

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.

Egy parancsot a formátuma, azaz a számára lefoglalt bitek száma jellemzi, 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 parancsokat szomszédos nyelveken kell elhelyezni. A parancs formátuma a végrehajtott művelet sajátosságaitól függ.

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

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

A második és harmadik bájt tartalmazhat adatokat, amelyeken műveleteket hajtanak végre, 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 parancsokban a műveleti kódnak van egy lerövidített formája az angol szavak írására - ez 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 funkcionális céljuk alapján.

A végrehajtás előtt a forrásprogramot egy assembler nevű fordítóprogrammal lefordítják a kódkombinációk nyelvére - gépi nyelvre, ebben a formában az MP memóriájába kerül, majd a parancs végrehajtása során kerül felhasználásra.


Megszólítási módszerek

Minden operandus kódot (bemeneti és kimeneti) el kell helyezni valahol. Elhelyezhetők az MP belső regisztereiben (a legkényelmesebb és gyors opció). A rendszermemóriában találhatók (a leggyakoribb lehetőség). Végül az I/O eszközökben is elhelyezhetők (a legritkább eset). Az operandusok helyét az utasításkód határozza meg. Létezik különböző módszerek, amellyel az utasításkód meg tudja határozni, hogy hova vegyük a bemeneti operandust és hova helyezzük 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 léteznek:

Közvetlen;

Regisztráció;

Közvetett;

Halmozott.

Közvetlen A címzés feltételezi, hogy a (bemeneti) operandus közvetlenül az utasításkód után található a memóriában. Az operandus általában egy állandó, amelyet el kell küldeni valahova, hozzá kell adni valamihez stb. az adatok a parancs második vagy második és harmadik bájtjában találhatók, az adatok alsó bájtja pedig a parancs második bájtjában, és a magas bá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 programon belül. Három bájtos parancsokban használatos.

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

Közvetett Az (implicit) címzés azt feltételezi, hogy az MP belső regisztere nem magát az operandust, hanem a címét tartalmazza a memóriában.

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 (veremmutató) 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 egyszerű műveleteket hajt végre, például elemi aritmetikai és logikai műveleteket, adatátvitelt, két érték összehasonlítását stb. Az MP KR580VM80 parancsainak száma 78 (244 módosítást figyelembe véve).

A következő parancscsoportokat különböztetjük meg:

Adatátvitel;

Számtan;

Összerakós játékaik;

Ugrás parancsok;

Bemeneti/kimeneti, vezérlési és verem parancsok.


Parancsok leírásánál és programok összeállítá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 eszköz címe
BYTE 2 A parancs második bájtja
Bájt 3 A parancs harmadik bájtja
R, R1, R2 Az egyik regiszter: A, B, C, D, E, H, L
R.P. Az egyik regiszterpár: B - a BC párt adja meg; D - egy DE párt határoz meg; H – a HL-párt határozza meg
RH A pár első regisztrációja
R.L. A pár második regisztere
Λ Logikai szorzás
V Logikus kiegészítés
Kiegészítés modulo two
M Memóriacella, amelynek címe a HL regiszterpár tartalmát határozza meg, azaz M = (HL)

1. PC architektúra…………………………………………………………………………………5

    1.1. Regiszterek.

    1.1.1 Általános célú nyilvántartások.

1.1.2. Szegmensregiszterek

1.1.3 Zászlóregiszter

1.2. Az emlékezet szervezése.

1.3. Adatok bemutatása.

1.3.1 Adattípusok

1.3.2 Karakterek és karakterláncok ábrázolása

2. Program utasítások az assemblerben ………………………………………

    1. Assembly nyelvi parancsok

2.2. Címzési módok és gépi utasításformátumok

3. Ál-operátorok……………………………………………………….

3.1 Adatdefiníciós irányelvek

3.2 Az assembler program felépítése

3.2.1 Programszegmensek. irányelvet feltételezni

3.2.3 Egyszerűsített szegmentációs irányelv

4. A műsor összeállítása és összeállítása …………………………….

5. Adatátviteli parancsok……………………………………………….

    5.1 Általános parancsok

    5.2 Stack parancsok

5.3 I/O parancsok

5.4 Címtovábbítási parancsok

5.5 Továbbítási parancsok megjelölése

6. Aritmetikai parancsok……………………………………………….

    6.1 Aritmetikai műveletek bináris egész számokkal

6.1.1 Összeadás és kivonás

6.1.2 Parancsok a vevő eggyel növelésére és csökkentésére

6.2 Szorzás és osztás

6.3 Jelváltás

7. Logikai műveletek……………………………………………….

8. Változások és ciklikus eltolások…………………………………………………………

9. Karakterlánc-műveletek……………………………………………………….

10. A programok logikája és felépítése………………………………………

10.1 Feltétel nélküli ugrások

10.2 Feltételes ugrások

10.4 Eljárások assembly nyelven

10.5 INT megszakítások

10.6 Rendszerszoftver

10.6.1.1 A billentyűzet olvasása.

10.6.1.2 Karakterek megjelenítése a képernyőn

10.6.1.3 Programok befejezése.

10.6.2.1 Megjelenítési módok kiválasztása

11. Lemezmemória………………………………………………………………..

11.2 Fájlelosztási táblázat

11.3 Lemez I/O műveletei

11.3.1 Fájl írása lemezre

11.3.1.1 ASCIIZ adatok

11.3.1.2 Fájlszám

11.3.1.3 Lemezfájl létrehozása

11.3.2 Lemezfájl olvasása

Bevezetés

Az assembly nyelv a gépi nyelv szimbolikus ábrázolása. A személyi számítógépben (PC) a legalacsonyabb hardverszinten lévő összes folyamatot csak gépi nyelvi parancsok (utasítások) hajtják végre. A hardverrel kapcsolatos (sőt, hardverfüggő, pl. a program sebességének növelése) problémákat az assembler ismerete nélkül nem lehet igazán megoldani.

Az assembler a parancsok kényelmes formája közvetlenül a PC-összetevők számára, és az ezeket az összetevőket tartalmazó integrált áramkör, nevezetesen a PC mikroprocesszor tulajdonságainak és képességeinek ismeretét igényli. Így az assembly nyelv közvetlenül kapcsolódik a PC belső szervezetéhez. És nem véletlen, hogy szinte minden magas szintű nyelvi fordító támogatja a programozás összeállítási szintjéhez való hozzáférést.

A professzionális programozó képzés egyik eleme szükségszerűen az assembler tanulmányozása. Az assembly nyelvű programozás ugyanis megköveteli a PC-architektúra ismeretét, ami lehetővé teszi, hogy más nyelveken is hatékonyabb programokat készítsünk, és azokat assembly nyelvű programokkal kombináljuk.

A kézikönyv assembly nyelven tárgyalja az Intel mikroprocesszorokon alapuló számítógépek programozását.

Ez az oktatóanyag mindenkinek szól, aki érdeklődik a processzor architektúra és az Assembly nyelvű programozás alapjai iránt, elsősorban szoftvertermék-fejlesztőknek.

    PC architektúra.

A számítógép-architektúra a számítógép absztrakt ábrázolása, amely tükrözi annak szerkezeti, áramköri és logikai felépítését.

Minden modern számítógép rendelkezik néhány közös és egyedi építészeti tulajdonsággal. Az egyes tulajdonságok egyediek egy adott számítógépmodellre.

A számítógép-architektúra fogalma magában foglalja:

    számítógépes blokkdiagram;

    a számítógépes blokkdiagram elemeihez való hozzáférés módjai és módjai;

    regiszterek beállítása és elérhetősége;

    a megszólítás szervezése és módszerei;

    számítógépes adatok bemutatásának és formátumának módja;

    számítógépes gépi utasításkészlet;

    gépi utasítás formátumok;

    megszakítás kezelés.

A számítógépes hardver fő elemei: rendszeregység, billentyűzet, megjelenítő eszközök, lemezmeghajtók, nyomtatóeszközök (nyomtató) és különféle kommunikációs berendezések. Rendszer egysége alaplapból, tápegységből és kiegészítő kártyákhoz való bővítőcellákból áll. Az alaplap tartalmaz egy mikroprocesszort, csak olvasható memóriát (ROM), RAM(RAM) és társprocesszor.

      Regiszterek.

A mikroprocesszoron belül az információkat egy 32 regiszterből álló csoport (16 felhasználó, 16 rendszer) tartalmazza, bizonyos fokig a programozó rendelkezésére áll. Mivel a kézikönyv a 8088-i486 mikroprocesszor programozásával foglalkozik, a leglogikusabb ezt a témát a mikroprocesszor felhasználó által elérhető belső regisztereinek tárgyalásával kezdeni.

A felhasználói regisztereket a programozó programírásra használja. Ezek a regiszterek a következőket tartalmazzák:

    nyolc 32 bites regiszter (általános célú regiszter) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    hat 16 bites szegmensregiszter: CS, DS, SS, ES, FS, GS;

    állapot- és vezérlőregiszterek: EFLAGS/FLAGS jelzőregiszter és EIP/IP parancsmutató regiszter.

Egy 32 bites regiszter részeit perjel jelzi. Az E (Extended) előtag 32 bites regiszter használatát jelzi. A bájtokkal való munkához L (alacsony) és H (magas) előtagú regisztereket használnak, például AL, CH - a regiszterek 16 bites részének alacsony és magas bájtjait.

        Általános célú nyilvántartások.

EAX/AX/AH/AL (Akkumulátorregiszter) – akkumulátor. Szorzásnál és osztásnál, I/O műveleteknél és egyes karakterlánc-műveleteknél használatos.

EBX/BX/BH/BL – alapregiszter(alapregiszter), gyakran használják a memóriában lévő adatok címzésekor.

ECX/CX/CH/CL – számláló(számlálóregiszter), a ciklus ismétlődéseinek számlálójaként szolgál.

EDX/DX/DH/DL – adatnyilvántartás(adatnyilvántartás), köztes adatok tárolására szolgál. Egyes csapatoknál a használata kötelező.

Ebben a csoportban minden regiszter lehetővé teszi a hozzáférést az „alsó” részekhez. 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.

A 32, 16 vagy 8 bites elemláncok szekvenciális feldolgozását lehetővé tevő karakterlánc-feldolgozási parancsok támogatásához a következőket kell használni:

ESI/SI (forrásindex regiszter) – index forrás. Az aktuális forráselem címét tartalmazza.

EDI/DI (célindex regiszter) – index vevő(befogadó). Az aktuális címet tartalmazza a célsorban.

A mikroprocesszoros architektúrában egy adatstruktúra – egy verem – támogatott hardver és szoftver szinten. Vannak speciális utasítások és speciális regiszterek a veremekkel való munkához. Meg kell jegyezni, hogy a verem a kisebb címek felé van feltöltve.

ESP/SP (stack pointer regiszter) – Regisztráció mutató Kazal. Az aktuális veremszegmensben lévő verem tetejére mutató mutatót tartalmaz.

EBP/BP (alapmutató regiszter) – verem alapmutató regiszter. A veremben lévő adatok véletlenszerű elérésének megszervezésére tervezték.

1.1.2. Szegmensregiszterek

A mikroprocesszoros szoftvermodell hat szegmensregiszterek: CS, SS, DS, ES, GS, FS. Létezésük a RAM sajátos felépítésének és az Intel mikroprocesszorok általi használatának köszönhető. A mikroprocesszoros hardver támogatja a program szerkezeti felépítését, amely a következőkből áll szegmensek. A rendelkezésre álló szegmensek jelzésére Ebben a pillanatban szegmensregiszterek célja. A mikroprocesszor a következő szegmenstípusokat támogatja:

    Kód szegmens. Programparancsokat tartalmaz. A szegmens eléréséhez használja a CS regisztert (kódszegmens regiszter) - szegmens kód regiszter. Annak a gépi utasításszegmensnek a címét tartalmazza, amelyhez a mikroprocesszor hozzáfér.

    Adatszegmens. A program által feldolgozott adatokat tartalmazza. A szegmens eléréséhez használja a DS (adatszegmens regiszter) regisztert - szegmens adatregiszter, amely az aktuális program adatszegmensének címét tárolja.

    Stack szegmens. Ez a szegmens egy memóriaterület, amelyet veremnek neveznek. A mikroprocesszor az alapelv szerint rendezi a veremet - először „be”, először „ki”. A verem eléréséhez használja az SS (stack segment register) regisztert - verem szegmensregiszter, amely a verem szegmens címét tartalmazza.

    További adatszegmens. A feldolgozott adatok további három adatszegmensben helyezkedhetnek el. Alapértelmezés szerint az adatok az adatszegmensben vannak. További adatszegmensek használatakor a címüket kifejezetten meg kell adni a parancsban található speciális szegmens felülbíráló előtagokkal. A további adatszegmensek címeinek szerepelniük kell az ES, GS, FS regiszterekben (kiterjesztési adatszegmens regiszterekben).

        Ellenőrzési és állapotregiszterek

A mikroprocesszor több regisztert tartalmaz, amelyek maguknak a mikroprocesszornak és annak a programnak az állapotáról is tartalmaznak információkat, amelyek parancsai éppen betöltődnek a folyamatba. Ez:

EIP/IP Instruction Pointer Register;

    zászló regiszter EFLAGS/FLAGS.

Ezekkel a regiszterekkel információkat szerezhet a parancsvégrehajtás eredményeiről, és befolyásolhatja magának a mikroprocesszornak az állapotát.

EIP/IP (utasításmutató regiszter) – mutató csapatok. Az EIP/IP regiszter 32 bites vagy 16 bites széles, és tartalmazza a következő végrehajtandó utasítás eltolását a CS szegmensregiszter tartalmához képest az aktuális utasításszegmensben. Ez a regiszter közvetlenül nem érhető el, de az ugrási utasításokkal módosítható.

ZÁSZLÓK/ZSZÁSZLÓK (zászlóregiszter) – Regisztráció zászlókat. Bitméret 32/16 bit. Ennek a regiszternek az egyes bitjei meghatározott funkcionális céllal rendelkeznek, és zászlóknak nevezzük. A jelző olyan bit, amely valamilyen feltétel teljesülése esetén 1-es értéket ("jelző beállítva"), egyébként pedig 0-t ("jelző törölve") vesz fel. Ennek a regiszternek az alsó része teljesen hasonló az i8086 FLAGS regiszteréhez.

1.1.3 Zászlóregiszter

A flags regiszter 32 bites, neve EFLAGS (1. ábra). A regiszter egyes bitjei meghatározott funkcionális céllal rendelkeznek, és zászlóknak nevezzük. Mindegyikhez külön név tartozik (ZF, CF stb.). Az EFLAGS alsó 16 bitje az i086 és i286 mikroprocesszorokhoz írt programok végrehajtásakor használt 16 bites FLAGS jelzőregisztert jelenti.

Fig.1 Flag Register

Egyes zászlókat általában feltételjelzőknek nevezik; automatikusan változnak a parancsok végrehajtásakor, és rögzítik az eredmény bizonyos tulajdonságait (például, hogy egyenlő-e nullával). A többi zászlót államzászlónak nevezzük; változnak a programból és befolyásolják a processzor további viselkedését (például blokkolják a megszakításokat).

Állapotjelzők:

CF (carry flag) - zászlót hordani. 1-et vesz fel, ha egész számok összeadásakor olyan átviteli egység jelent meg, amely nem „fért be” a bitrácsba, vagy ha az előjel nélküli számok kivonásakor az első kisebb volt, mint a második. A shift parancsokban a bitrácson kívül eső bit a CF-be kerül. A CF a szorzási utasítás jellemzőit is rögzíti.

OF (túlcsordulásjelző) - túlcsordulás zászló. Állítson 1-re, ha az előjeles egész számok összeadásakor vagy kivonásakor az eredmény abszolút értékben meghaladja a megengedett értéket (a mantissza túlcsordult, és az előjeles számjegybe „kúszott”).

ZF (nulla zászló) - nulla zászló. Állítsa 1-re, ha a parancs eredménye 0.

SF (Sign flag) - zászló jel. Állítsa 1-re, ha az előjeles számokkal végzett művelet negatív eredményt ad.

PF (paritásjelző) - zászló paritás. Egyenlő 1-gyel, ha a következő parancs eredménye páros számú binárist tartalmaz. Általában csak az I/O műveleteknél veszik figyelembe.

AF (auxiliary carry flag) - extra hordzászló. Javítja a bináris decimális számokkal végzett műveletek jellemzőit.

Állami zászlók:

DF (irányjelző) - irányzászló. Beállítja a vonalak nézésének irányát a sorparancsokban: ha DF=0, a sorok „előre” (elejétől a végéig), ha DF=1 – ellenkező irányban jelennek meg.

IOPL (bemeneti/kimeneti jogosultsági szint) – I/O jogosultsági szint. A mikroprocesszoros működés védett módjában az I/O parancsokhoz való hozzáférés vezérlésére szolgál, a feladat jogosultságától függően.

NT (beágyazott feladat) – feladat beágyazási jelző. A mikroprocesszor védett üzemmódjában használják annak rögzítésére, hogy az egyik feladat egy másikba van beágyazva.

Rendszerjelző:

IF (megszakítás jelző) - megszakítás jelző. Ha IF=0, a processzor nem válaszol a bejövő megszakításokra; ha IF=1, a megszakítás blokkolása megszűnik.

TF (csapda zászló) - nyom zászló. Ha TF=1, akkor minden egyes parancs végrehajtása után a processzor megszakítást hajt végre (1-es számmal), amely felhasználható egy program hibakeresése során annak nyomon követésére.

RF (resume flag) – önéletrajz zászló. A hibakeresési regiszterekből származó megszakítások feldolgozásakor használatos.

VM (virtuAL 8086 mód) – virtuális 8086 zászló. Az 1-processzor virtuális 8086-os, a 0-processzor valós vagy védett módban működik.

AC (ALiganment check) – igazításvezérlő zászló.Úgy tervezték, hogy lehetővé tegye az igazítás szabályozását a memória elérésekor.

      Az emlékezet szervezése.

A fizikai memóriát, amelyhez a mikroprocesszor hozzáfér, hívják RAM ( vagy véletlen hozzáférésű memória - RAM). A RAM egy bájtok láncolata, amelynek saját egyedi címe (száma) van, úgynevezett fizikai. A fizikai címértékek tartománya 0 és 4 GB között van. A memóriakezelési mechanizmus teljes mértékben hardveres.

A mikroprocesszoros hardver számos RAM-használati modellt támogat:

    szegmentált modell. Ebben a modellben a programok memóriája összefüggő memóriaterületekre (szegmensekre) van felosztva, és maga a program csak az ezekben a szegmensekben található adatokhoz férhet hozzá;

    oldal modellje. Ebben az esetben a RAM fix 4 KB méretű blokkok halmazának minősül. Ennek a modellnek a fő alkalmazása a szervezettel kapcsolatos virtuális memória, amely lehetővé teszi a programok számára, hogy több memóriát használjanak, mint a fizikai memóriát. Egy Pentium mikroprocesszornál a lehetséges virtuális memória mérete elérheti a 4 TB-ot.

Ezeknek a modelleknek a használata és megvalósítása a mikroprocesszor működési módjától függ:

    Valódi cím mód (valós mód). Az üzemmód hasonló az i8086 processzor működéséhez. A korai processzoros modellekhez fejlesztett programok működéséhez szükséges.

    Védett mód. A védett mód lehetővé teszi a többfeladatos munkát információ feldolgozás, memóriavédelem négyszintű jogosultsági mechanizmussal és annak lapozási szervezetével.

    Virtuális 8086 mód. Ebben a módban számos program futtatható az i8086-hoz. Ebben az esetben valós módú programok működhetnek.

A szegmentálás olyan címzési mechanizmus, amely több független címtér létezését biztosítja. A szegmens egy független, hardver által támogatott memóriablokk.

Minden program általában tetszőleges számú szegmensből állhat, de közvetlenül hozzáfér három fő szegmenshez: kódhoz, adathoz és veremhez – és egy-három további adatszegmenshez. Az operációs rendszer meghatározott fizikai címeken programszegmenseket helyez el a RAM-ban, majd ezeknek a címeknek az értékeit a megfelelő regiszterekbe helyezi. Egy szegmensen belül a program a szegmens elejéhez viszonyított címeket lineárisan éri el, azaz a 0 címtől kezdve a szegmens méretével megegyező címre végződik. Rokon cím ill Elfogultság, amelyet a mikroprocesszor egy szegmensen belüli adatok elérésére használ fel hatékony.

Fizikai cím kialakítása valós módban

Valós módban a fizikai cím változási tartománya 0 és 1 MB között van. A szegmens maximális mérete 64 KB. Amikor kapcsolatba lép egy konkrét valódi cím A RAM-ot a szegmens elejének címe és a szegmensen belüli eltolás határozza meg. A szegmens kezdőcímét a megfelelő szegmensregiszterből veszik. Ebben az esetben a szegmensregiszter csak a szegmens kezdetének fizikai címének legjelentősebb 16 bitjét tartalmazza. A 20 bites cím hiányzó alsó négy bitjét úgy kapjuk meg, hogy a szegmensregiszter értékét 4 bittel balra toljuk. A váltási művelet hardverben történik. A kapott 20 bites érték a szegmens kezdetének megfelelő valós fizikai cím. Azaz fizikai cím"szegmens:eltolás" párként van megadva, ahol a "szegmens" annak a memóriaszegmensnek a kezdőcímének első 16 bitje, amelyhez a cella tartozik, az "eltolás" pedig ennek a cellának a 16 bites címe, az ennek a memóriaszegmensnek az eleje (értéke 16 * szegmens + offset a cella abszolút címét adja meg). Ha például a CS regiszter az 1234h értéket tárolja, akkor az 1234h:507h címpár abszolút címet határoz meg, amely egyenlő 16*1234h+507h =12340h+507h = 12847h. Egy ilyen pár kettős szóként van írva, és (a számokhoz hasonlóan) „fordított” formában: az első szó eltolást, a második pedig egy szegmenst tartalmaz, és ezek a szavak mindegyike egy szegmensben jelenik meg. „fordított” forma. Például az 1234h:5678h pár a következőképpen írható:| 78 | 56| 34 | 12|.

Ez a fizikai cím generálási mechanizmus lehetővé teszi a szoftver áthelyezhetővé tételét, azaz függetlenné tételét a RAM-ban lévő meghatározott betöltési címektől.

A gépi utasítás szintű programozás az a minimális szint, amelyen programokat lehet írni. A gépi utasítások rendszerének elegendőnek kell lennie a szükséges műveletek végrehajtásához a számítógép hardverének utasításokkal.

Minden gépi parancs két részből áll:

  • operatív - a „mit kell tenni” meghatározása;
  • operandus – feldolgozó objektumok meghatározása, „mihez kezdjünk”.

Az assembly nyelven írt mikroprocesszoros gépparancs egy sor a következő szintaktikai formában:

parancs/irányelv címke operandus(ok) ;megjegyzések

Ebben az esetben a sorban kötelező mező egy parancs vagy utasítás.

A címkét, a parancsot/direktívát és az operandusokat (ha vannak) legalább egy szóköz vagy tabulátor karakter választja el.

Ha egy parancsot vagy 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 assembly nyelv nem tesz különbséget a kis- és nagybetűk között a parancsok vagy direktívák írásakor.

Példa kódsorok:

Számolj db 1-et ;Név, direktíva, egy operandus
mov eax,0 ;Parancs, két operandus
cbw ; Csapat

Címkék

Címke assembly nyelven a következő szimbólumokat tartalmazhatja:

  • a latin ábécé összes betűje;
  • számok 0-tól 9-ig;
  • speciális karakterek: _, @, $, ?.

A pont használható a címke első karaktereként, de egyes fordítók nem javasolják ennek a karakternek a használatát. A fenntartott Assembler nevek (irányelvek, operátorok, parancsnevek) nem használhatók címkeként.

A címke első karakterének betűnek vagy speciális karakternek kell lennie (de nem számnak). Maximális hossz címkék – 31 karakter. Minden olyan címkének, amely egy assembler direktívát nem tartalmazó sorba ír, kettősponttal kell végződnie: .

Csapatok

Csapat megmondja a fordítónak, hogy a mikroprocesszornak milyen műveletet kell végrehajtania. Egy adatszegmensben egy parancs (vagy direktíva) határoz meg egy mezőt, munkaterületet vagy állandót. A kódszegmensben a parancs egy műveletet határoz meg, például mozgatást (mov) vagy hozzáadást (add).

irányelvek

Az assemblernek számos operátora van, amelyek lehetővé teszik az összeszerelés és a listázás folyamatának vezérlését. Ezeket az operátorokat hívják irányelveket . Csak a program összeállítása során működnek, és a parancsokkal ellentétben nem generálnak gépi kódot.

Operandusok

Operandus – olyan objektum, amelyen egy gépi parancs vagy programozási nyelvi utasítás végrehajtásra kerül.
Egy utasításnak lehet egy vagy két operandusa, vagy egyáltalán nem. Az operandusok számát implicit módon az utasításkód adja meg.
Példák:

  • Nincs operandus ret ;Return
  • Egy operandus inc ecx ;Növelje ecx
  • Két operandus add eax,12 ;Add 12 to eax

A címkének, a parancsnak (direktívának) és az operandusnak nem kell a sorban egy adott helyen kezdődnie. Javasoljuk azonban, hogy ezeket egy oszlopba írjuk, hogy a program könnyebben olvasható legyen.

Az operandusok lehetnek

  • azonosítók;
  • karakterláncok szimpla vagy dupla idézőjelbe zárva;
  • egész számok bináris, oktális, decimális vagy hexadecimális számrendszerekben.
Azonosítók

Azonosítók – programobjektumok, például műveleti kódok, változónevek és címkenevek jelölésére használt érvényes karaktersorozatok.

Az azonosítók rögzítésének szabályai.

  • Az azonosító egy vagy több karakterből állhat.
  • Szimbólumként használhatja a latin ábécé betűit, számokat és néhány speciális karaktert: _, ?, $, @.
  • Az azonosító nem kezdődhet számjegy karakterrel.
  • Az azonosító hossza legfeljebb 255 karakter lehet.
  • A fordító elfogadja az azonosító első 32 karakterét, a többit figyelmen kívül hagyja.
Hozzászólások

A megjegyzéseket karakter választja el a végrehajtható sortól; . Ebben az esetben a pontosvessző után és a sor végéig írt minden megjegyzés. A megjegyzések használata javítja a program áttekinthetőségét, különösen akkor, ha a parancskészlet célja nem egyértelmű. A megjegyzés bármilyen nyomtatható karaktert tartalmazhat, beleértve a szóközöket is. A megjegyzés átívelheti a teljes sort, vagy követheti az ugyanabban a sorban lévő parancsot.

Az összeszerelési program felépítése

Egy assembly nyelven írt program több részből állhat, ún modulok . Minden modul egy vagy több adat-, verem- és kódszegmenssel rendelkezhet. Minden teljes assembler programnak tartalmaznia kell egy fő vagy fő modult, amelyből a végrehajtása kezdődik. Egy modul tartalmazhat kódszegmenseket, adatszegmenseket és veremszegmenseket, amelyeket megfelelő direktívák segítségével deklarálnak. A szegmensek deklarálása előtt meg kell adnia a memóriamodellt a .MODEL direktíva segítségével.

Példa a „semmit ne csinálj” programra assembly nyelven:

686P
.MODEL FLAT, STDCALL
.ADAT
.KÓD
RAJT:

RET
VÉGE START

Ez a program csak egy mikroprocesszor parancsot tartalmaz. Ez a parancs RET. Ez biztosítja a program megfelelő leállását. Általában ez a parancs az eljárásból való kilépésre szolgál.
A program többi része a fordító működésére vonatkozik.
.686P - A Pentium 6 (Pentium II) védett módú parancsai megengedettek. Ez a direktíva kiválasztja a támogatott assembler utasításokat, jelezve a processzor modelljét. A direktíva végén jelzett P betű tájékoztatja a fordítót, hogy a processzor védett módban működik.
.MODEL FLAT, stdcall - lapos memória modell. Ezt a memóriamodellt a műtőben használják Windows rendszer. stdcall
A .DATA egy adatokat tartalmazó programszegmens.
A .CODE egy kódot tartalmazó programblokk.
START - címke. Az assemblerben a címkék nagy szerepet játszanak, ami a modern magas szintű nyelvekről nem mondható el.
END START - a program vége és egy üzenet a fordítónak, hogy a program végrehajtását a START címkével kell kezdeni.
Minden modulnak tartalmaznia kell egy END direktívát a vég jelzésére forráskód programokat. Az END direktívát követő összes sort figyelmen kívül hagyja. Ha kihagyja az END direktívát, hiba keletkezik.
Az END direktíva után megadott 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ó.




Top