itthon / Online szolgáltatások / Az IBM-PC Assembler nyelv parancsrendszerének általános jellemzői (alapparancskészlet, operandusok alapvető címzési módjai). A program felépítése Assembler nyelven. Assembly nyelvi parancsok Összeállítás nyelvi parancsai

Az IBM-PC Assembler nyelv parancsrendszerének általános jellemzői (alapparancskészlet, operandusok alapvető címzési módjai). A program felépítése Assembler nyelven. Assembly nyelvi parancsok Összeállítás nyelvi parancsai

Tanfolyami munka

Tárgy "Rendszerprogramozás"

4. témakör: "Eljárások problémáinak megoldása"

2. lehetőség

KELET-SZIBÉRIAI ÁLLAMI EGYETEM

TECHNOLÓGIA ÉS MENEDZSMENT

____________________________________________________________________

TECHNOLÓGIAI FŐISKOLA

GYAKORLAT

szakdolgozathoz

Fegyelem:
Téma: Problémamegoldás eljárásokhoz
Művész(ek): Glavinskaya Arina Alexandrovna
Vezető: Sesegma Viktorovna Dambaeva
A munka rövid összefoglalása: szubrutinok tanulmányozása on Assembly nyelv,
problémamegoldás szubrutinok segítségével
1. Elméleti rész: Alapvető információk az assembly nyelvről (készlet
parancsok stb.), Alprogramok szervezése, Paraméterek átadásának módjai
szubrutinokban
2. Gyakorlati rész: Készítsen két szubrutint, amelyek közül az egyik bármely adott betűt nagybetűvé alakítja (beleértve az orosz betűket is), a másik pedig a betűt kisbetűvé.
bármely adott betűt nagybetűvé, a másik pedig a betűt kisbetűvé alakítja.
betűt kisbetűvé alakít.
A projekt ütemezése az ütemterv szerint:
1. Elméleti rész - 30% a 7. hétig.
2. Gyakorlati rész - 70% 11 hétig.
3. Védelem - 100% 14 hétig.
Tervezési követelmények:
1. A tanfolyami projekt elszámolását és magyarázó jegyzetét ben kell benyújtani
elektronikus és nyomtatott példányok.
2. A jelentés terjedelme a mellékletek nélkül legalább 20 géppel írt oldal legyen.
3. Az RPP-t a GOST 7.32-91 szerint állítják össze, és a fej írja alá.

Munkahelyi vezető __________________

Előadó __________________

Kiadás dátuma " 26 " szeptember 2017 G.


Bevezetés. 2

1.1 Alapvető információk az assembly nyelvről. 3

1.1.1 Parancskészlet. 4

1.2 Alprogramok szervezése assembly nyelven. 4

1.3 Paraméterek átadásának módjai szubrutinokban. 6

1.3.1 Paraméterek átadása regisztereken keresztül.. 6

1.3.2 Paraméterek átadása a veremen. 7

2 GYAKORLATI RÉSZ.. 9

2.1 A probléma megfogalmazása. 9

2.2 A probléma megoldásának leírása. 9

2.3 A program tesztelése.. 7

Következtetés. 8

Hivatkozások.. 9


Bevezetés

Köztudott, hogy Assembly nyelven nehéz programozni. Mint tudod, ma már sokféle nyelv létezik magas szint , amelyek lehetővé teszik, hogy sokkal kevesebb erőfeszítést költsön a programok írására. Természetesen felmerül a kérdés, hogy mikor kell egy programozónak használnia az Assemblert a programok írásakor. Jelenleg két olyan terület van, ahol indokolt, gyakran szükséges is az assembly nyelv használata.

Először is ezek az úgynevezett gépfüggő rendszerprogramok, általában ők irányítanak különféle eszközök számítógépen (az ilyen programokat illesztőprogramoknak nevezzük). Ezek a rendszerprogramok speciális gépi utasításokat használnak, amelyeket nem kell a szokásos (vagy ahogy mondják, alkalmazott) programok. Ezeket a parancsokat lehetetlen vagy nagyon nehéz megadni egy magas szintű nyelven.

Az Assembler második alkalmazási területe a programvégrehajtás optimalizálásához kapcsolódik. Nagyon gyakran a magas szintű nyelvekből származó fordítóprogramok (fordítók) nagyon nem hatékony gépi nyelvi programot állítanak elő. Ez általában azokra a számítási jellegű programokra vonatkozik, amelyekben a program egy nagyon kis (kb. 3-5%) szakasza (a fő hurok) fut le legtöbbször. A probléma megoldására úgynevezett többnyelvű programozási rendszerek használhatók, amelyek lehetővé teszik a program egyes részei különböző nyelveken történő megírását. Általában a program fő része magas szintű programozási nyelven (Fortran, Pascal, C stb.), a program időkritikus részei pedig Assemblerben készülnek. Ebben az esetben a teljes program sebessége jelentősen megnőhet. Gyakran ez az egyetlen módja annak, hogy egy program ésszerű időn belül eredményt hozzon.

Ez lejáratú papírok gyakorlati ismereteket szerezni assembly nyelvű programozásban.

Munkafeladatok:

1. Az Assembler nyelvvel kapcsolatos alapvető információk tanulmányozása (a program felépítése és összetevői az Assemblerben, a parancsok formátuma, az alprogramok felépítése stb.);

2. Tanulmányozni a bitműveletek típusait, az assembler logikai parancsok formátumát és logikáját;

3. Egyéni feladat megoldása a szubrutinok használatára az Assemblerben;

4.. Fogalmazzon meg következtetést az elvégzett munkáról.

1 ELMÉLETI RÉSZ

Assembly nyelvi alapismeretek

Assembler - programozási nyelv alacsony szint, amely az emberi észlelés szempontjából kényelmes gépi utasítások írásának formátuma.

Az összeállítási nyelvi parancsok egyenként megfelelnek a processzorparancsoknak, és valójában a parancsok és argumentumaik kényelmes szimbolikus jelölési formáját (mnemonikus kódját) képviselik. Az Assembly nyelv alapvető programozási absztrakciókat is biztosít: a program részeit és az adatokat szimbolikus neveket és direktívákat tartalmazó címkéken keresztül kapcsolja össze.

Az összeállítási direktívák lehetővé teszik (explicit módon leírt vagy fájlból kiolvasott) adatblokkok beillesztését a programba; ismételje meg egy bizonyos töredéket meghatározott számú alkalommal; állítsa össze a töredéket a feltételnek megfelelően; állítsa be a töredék végrehajtási címét, módosítsa a címkeértékeket a fordítás során; makródefiníciókat használjon paraméterekkel stb.

Előnyök és hátrányok

A redundáns kód minimális mennyisége (kevesebb parancs és memória-hozzáférés használata). Ennek eredményeként nagyobb sebesség és kisebb méret programok;

nagy mennyiségű kód, nagyszámú további kis feladat;

A kód gyenge olvashatósága, támogatási nehézségek (hibakeresés, szolgáltatások hozzáadása);

· a programozási paradigmák és egyéb, kissé bonyolult konvenciók megvalósításának nehézségei, a közös fejlesztés bonyolultsága;

Kevesebb elérhető könyvtár, alacsony kompatibilitásuk;

· közvetlen hozzáférés a hardverhez: bemeneti-kimeneti portok, speciális processzorregiszterek;

maximális „illesztés” a kívánt platformhoz (különleges utasítások használata, műszaki jellemzők"mirigy");

· nem hordozható más platformokra (a bináris kompatibilisek kivételével).

A program az utasításokon kívül tartalmazhat direktívákat: olyan parancsokat, amelyek nem fordítódnak közvetlenül gépi utasításokká, hanem a fordító működését vezérlik. Beállításuk és szintaxisuk jelentősen eltér, és nem a hardverplatformtól, hanem a használt fordítótól függ (ami az azonos architektúracsaládon belüli nyelvek dialektusait eredményezi). Irányelvek halmazaként megkülönböztethetjük:

Adatok meghatározása (állandók és változók);

a program memóriában való szervezésének és a kimeneti fájl paramétereinek kezelése;

a fordítói mód beállítása;

Mindenféle absztrakció (azaz magas szintű nyelvek elemei) - az eljárások és funkciók tervezésétől (a procedurális programozási paradigma megvalósításának egyszerűsítése érdekében) a feltételes struktúrákig és ciklusokig (a paradigmához) strukturált programozás);

makrók.

Parancskészlet

A tipikus assembly nyelvi utasítások a következők:

Adatátviteli parancsok (mov stb.)

Aritmetikai parancsok (add, sub, imul stb.)

Logikai és bitenkénti műveletek (vagy, és, xor, shr stb.)

Parancsok a program végrehajtásának kezelésére (jmp, loop, ret stb.)

Hívásmegszakítási parancsok (néha vezérlőparancsoknak is nevezik): int

I / O parancsok a portokhoz (be, ki)

A mikrokontrollereket és a mikroszámítógépeket olyan parancsok is jellemzik, amelyek feltétel szerinti ellenőrzéseket és átmeneteket hajtanak végre, például:

· jne - ugrás, ha nem egyenlő;

· jge - ugrás, ha nagyobb vagy egyenlő, mint .

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

A szimbolikus assembly nyelv lehetővé teszi a gépi nyelvű programozás hiányosságainak nagyrészt kiküszöbölését.

Legfőbb előnye, hogy az assembly nyelvben minden programelem szimbolikus formában jelenik meg. Konvertálja a szimbolikus parancsneveket a sajátjukká bináris kódok hozzá vannak rendelve speciális program- assembler, amely megszabadítja a programozót a fáradságos munkától és kiküszöböli az elkerülhetetlen hibákat.

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

Az assembly nyelvű programozáshoz komplexnek kell lennie eszközöket mint gépi nyelven programozáskor: mikroszámítógépeken alapuló számítógépes rendszerekre vagy készlettel rendelkező PC-kre van szükség perifériák(alfanumerikus billentyűzet, karakteres kijelző, hajlékonylemez és nyomtató), valamint rezidens vagy keresztprogramozási rendszerek a szükséges típusú mikroprocesszorokhoz. Az Assembly nyelv lehetővé teszi a gépi nyelvnél sokkal összetettebb programok hatékony írását és hibakeresését (akár 1-4 KB).

Az összeállítási nyelvek géporientáltak, vagyis a megfelelő mikroprocesszor gépi nyelvétől és szerkezetétől függenek, mivel minden mikroprocesszor utasításhoz egy adott szimbolikus nevet rendelnek.

Az összeállítási nyelvek jelentős növekedést biztosítanak a programozók termelékenységében a gépi nyelvekhez képest, és ugyanakkor megtartják a mikroprocesszor összes szoftverrel elérhető hardver erőforrásának használatát. Ez lehetővé teszi a gyakorlott programozók számára, hogy olyan programokat írjanak, amelyek rövidebb idő alatt futnak le, és kevesebb memóriát foglalnak el, mint a magas szintű nyelven írt programok.

Ebben a tekintetben szinte minden I / O eszközvezérlő program (illesztőprogram) assembly nyelven van írva, 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:

a mikroprocesszor gépi nyelvének minden egyes parancsának mnemonikus (szimbolikus neve);

szabványos formátum egy assemblerben leírt program soraihoz;

formátum a megadáshoz különböző módokon címzési és parancsopciók;

formátum a karakterkonstansok és az egész típusú konstansok megadásához különféle rendszerek leszámolás;

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

Az assembly nyelven a program soronként íródik, azaz minden utasításhoz 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, azonban az egyiknek általában egy gyakorlati eloszlása ​​van - ez az úgynevezett standard assembly nyelv.

A gépi utasítások szintjén történő programozás az a minimális szint, amelyen a 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 számítógép hardverének utasításokkal.

Minden gépi utasítás két részből áll:

működés - a "mit kell tenni" meghatározása;

· operandus - feldolgozó objektumok meghatározása, "mit kell csinálni".

A mikroprocesszor assembly nyelven írt gépi utasítása egyetlen sorból áll, a következő szintaktikai formában:

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

Ebben az esetben a sorban egy 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 nagy- és kisbetűk között a parancsokban vagy direktívákban.

Közvetlen címzés: A tényleges címet közvetlenül a gépi utasítás eltolási mező 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 a sum címen tárolt értéket az eax regiszterbe helyezi.

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

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

Közvetett alap (regiszter) címzés eltolással;

· közvetett indexcímzés;

· közvetett alapindex címzés.

Közvetett alap (regiszter) címzés. Ezzel a címzéssel az operandus effektív címe bármelyik regiszterben lehet Általános rendeltetésű, kivéve az sp/esp és a bp/ebp (ezek speciális regiszterek a veremszegmenssel való munkavégzéshez). Szintaktikailag egy utasításban ezt a címzési módot a regiszter nevének szögletes zárójelben való feltüntetésével fejezzük ki.

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

Struktúrák assembly nyelven

A fent tárgyalt tömbök azonos típusú elemek gyűjteményét alkotják. Az alkalmazásokban azonban gyakran figyelembe kell venni egy bizonyos adatkészletet különböző típusú mint valami egyedi típus.

Ez nagyon lényeges például az adatbázis-programoknál, ahol különböző típusú adatok gyűjteményét kell egy objektumhoz társítani.

Például korábban megnéztük a 4. listát, amely három bájtos elemekből álló tömbbel működött. Mindegyik elem két különböző típusú elem volt: egy egybájtos számlálómező és egy kétbájtos mező, amely a tároláshoz és a feldolgozáshoz szükséges további információkat hordozhatta. Ha az olvasó ismeri valamelyik magas szintű nyelvet, akkor tudja, hogy egy ilyen objektumot általában speciális adattípussal írnak le - szerkezetek.

Az assembly nyelv használhatóságának javítása érdekében ezt az adattípust is bevezették benne.

A-priory szerkezet egy olyan adattípus, amely meghatározott számú különböző típusú elemből áll.

Ha struktúrákat szeretne használni egy programban, három dolgot kell tennie:

    Kérdez szerkezeti sablon .

    Ez lényegében egy új adattípus definiálását jelenti, amivel később az ilyen típusú változók definiálhatók.

    Határozza meg szerkezet példány .

    Ez a szakasz egy adott változó inicializálását foglalja magában egy előre meghatározott (sablon segítségével) struktúrával.

    Szervez a struktúra tagjainak elérése .

Nagyon fontos, hogy már az elején megértsd, mi a különbség a kettő között leírás struktúrák a programban és annak meghatározás.

leírni a struktúra egy programban azt jelenti, hogy csak a sémáját vagy mintáját jelzi; memória nincs lefoglalva.

Ez a sablon csak információnak tekinthető a fordító számára a mezők helyéről és alapértelmezett értékéről.

Határozza meg A struktúra azt jelenti, hogy utasítja a fordítót, hogy foglaljon le memóriát és rendeljen szimbolikus nevet ehhez a memóriaterülethez.

A struktúrát a programban csak egyszer írhatja le, és akárhányszor definiálhatja.

Struktúra sablon leírása

A szerkezetsablon-deklaráció a következő szintaxissal rendelkezik:

szerkezet_neve STRUC

szerkezet_neve VÉGE

Itt adatleíró direktívák sorozata db, dw, dd, dqÉs dt.

Operandusaik határozzák meg a mezők méretét és opcionálisan a kezdeti értékeket. Ezek az értékek esetleg inicializálják a megfelelő mezőket a struktúra meghatározásakor.

Amint azt a sablon leírásakor már megjegyeztük, nincs memória foglalva, mivel ez csak információ a fordító számára.

Elhelyezkedés sablon a programban tetszőleges lehet, de az egymenetes fordító logikáját követve annak a hely előtt kell elhelyezkednie, ahol az ilyen szerkezetű változót meghatározzuk. Azaz, amikor egy változót valamilyen struktúra típusú adatszegmensben írunk le, a sablonját az adatszegmens elejére vagy elé kell helyezni.

Fontolja meg a struktúrákkal való munkát egy bizonyos részleg alkalmazottai adatbázisának modellezésével.

Az egyszerűség kedvéért, hogy elkerüljük a bevitel során az információkonverzió problémáit, egyetértünk abban, hogy minden mező szimbolikus.

Határozzuk meg ennek az adatbázisnak a rekordstruktúráját a következő mintával:

Adatok meghatározása struktúratípussal

Ahhoz, hogy a sablon segítségével leírt struktúrát a programban használhassuk, meg kell határozni egy változót ennek a szerkezetnek a típusával. Ehhez a következő szintaxist használják:

[változó neve] struktúra_neve

    változó neve- az adott szerkezettípus változó azonosítója.

    A változónév megadása nem kötelező. Ha nincs megadva, akkor a rendszer egyszerűen lefoglal egy memóriaterületet a struktúra összes elemének hosszának összegével.

    értékek listája- a szerkezeti elemek kezdeti értékeinek vesszővel elválasztott listája szögletes zárójelben.

    Feladata is választható.

    Ha a lista hiányos, akkor az adott változóhoz tartozó struktúra minden mezőjét a sablonból származó értékekkel inicializálja, ha van ilyen.

    Az egyes mezők inicializálása megengedett, de ebben az esetben a hiányzó mezőket vesszővel kell elválasztani. A hiányzó mezők inicializálása a struct sablonból származó értékekkel történik. Ha egy új változó definiálásakor ennek a szerkezetnek a típusával egyetértünk a sablonban szereplő összes mezőértékkel (vagyis alapértelmezés szerint), akkor csak szögletes zárójeleket kell írni.

    Például: győztes munkás.

Például definiáljunk több változót a fent leírt szerkezettípussal.

Szerkezeti módszerek

A strukturális típus bármely programozási nyelvbe történő bevezetésének ötlete az, hogy különböző típusú változókat egyesítsünk egy objektumba.

A nyelvnek lehetőséget kell biztosítania ezekhez a változókhoz egy adott struktúrapéldányon belül. Annak érdekében, hogy egy parancsban valamilyen szerkezetű mezőre hivatkozzanak, egy speciális operátort használnak - szimbólum ". " (pont). A következő szintaxisban használatos:

    cím_kifejezés- valamilyen szerkezeti típusú változó azonosító vagy zárójelben lévő kifejezés az alább jelzett szintaktikai szabályoknak megfelelően (1. ábra);

    szerkezet_mező_neve- mezőnév a szerkezetsablonból.

    Valójában ez is egy cím, vagy inkább a mező eltolása a struktúra elejétől.

Tehát az operátor" . " (pont) kiértékeli a kifejezést

Rizs. 5. Címkifejezés szintaxisa egy struktúramező hozzáférési operátorban

Mutassuk meg az általunk meghatározott szerkezet példáján munkás néhány technikát a szerkezetekkel való munkavégzéshez.

Például kivonat ide fejsze mezőértékek az életkorral. Mivel nem valószínű, hogy egy cselekvőképes személy életkora meghaladja a 99 évet, e karaktermező tartalmának nyilvántartásba vétele után fejsze paranccsal kényelmes lesz bináris reprezentációvá alakítani aad.

Legyen óvatos, mert az adattárolás elve miatt „alacsony bájt alacsony címen” a kor legmagasabb számjegye kerül be al, és a legfiatalabb a Ah.

A javításhoz használja a parancsot xchg al, ah:

mov ax,word ptr sotr1.age ;at al age sotr1

és ez így lehetséges:

A szerkezetek tömbjével végzett további munka ugyanúgy történik, mint egy egydimenziós tömb esetében. Itt több kérdés is felmerül:

Hogyan kezeljük a méretet és hogyan szervezzük meg a tömbelemek indexelését?

A programban definiált többi azonosítóhoz hasonlóan a fordító a struktúratípus nevéhez és a változó nevéhez a szerkezettípussal egy type attribútumot rendel hozzá. Ennek az attribútumnak az értéke a struktúra mezői által elfoglalt méret bájtokban. Ezt az értéket az operátor segítségével kinyerheti típus.

Ha egy struktúrapéldány mérete ismertté vált, az indexelés megszervezése struktúrák tömbjében nem különösebben nehéz.

Például:

Hogyan másolhatunk egy mezőt az egyik struktúrából egy másik struktúra megfelelő mezőjébe? Vagy hogyan lehet a teljes szerkezetet másolni? Másoljuk a mezőt nam harmadik alkalmazott a területen namötödik alkalmazott:

mas_sotr worker 10 dup()

mov bx, offset mas_sotr

mov si,(munkás típus)*2 ;si=77*2

mov di,(munkás típusa)*4 ;si=77*4

Nekem úgy tűnik, hogy a programozó mestersége előbb-utóbb jó háziasszonynak teszi az embert. Ő is, akárcsak ő, állandóan azt keresi, hol mentsen meg valamit, vágjon vissza, és készítsen egy csodálatos vacsorát minimális ételből. És ha ez sikerül, akkor az erkölcsi elégedettség nem kisebb, sőt talán több is, mint egy csodálatos vacsora a háziasszonynál. Úgy tűnik számomra, hogy ennek az elégedettségnek a mértéke a szakma iránti szeretet mértékétől függ.

Másrészt a szoftver- és hardverfejlesztésben elért haladás némileg ellazítja a programozót, és elég gyakran a légyről és az elefántról szóló közmondáshoz hasonló helyzet adódik – egy-egy apró probléma megoldására a nehéz eszközök amelyeknek hatékonysága általában csak viszonylag nagy projektek megvalósítása esetén jelentős.

A következő két típusú adat nyelven való jelenléte valószínűleg a „hostess” azon vágyának köszönhető, hogy az asztal munkaterületét (RAM) a lehető leghatékonyabban használja ételkészítéskor vagy termékek elhelyezésekor (programadatok) ).

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

    1.1. Regisztrálok.

    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. Adatábrázolás.

1.3.1 Adattípusok

1.3.2 Karakter- és karakterlánc-ábrázolás

2. Összeszerelési program nyilatkozatok ………………………………………

    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 összeszerelési program felépítése

3.2.1. Programrészletek. irányelvet feltételezni

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

4. A program összeállítása és összekapcsolá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 Zászló átviteli parancsok

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 Jelcsere

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 Megszakítja az INT

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ájlkiosztási táblázat

11.3 Lemez I/O

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 legalacsonyabb, hardverszintű személyi számítógépben (PC) minden folyamatot csak gépi nyelvi parancsok (utasítások) hajtanak végre. 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.

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 ismerete szükséges. Így az assembly nyelv közvetlenül kapcsolódik a PC belső szervezetéhez. És nem véletlen, hogy szinte minden magas szintű nyelv fordítója támogatja az assembler programozási szint elérését.

A professzionális programozó felkészítésének 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 az Intel mikroprocesszorokon alapuló számítógépek assembly nyelvű programozásával foglalkozik.

Ez az oktatóanyag mindenkinek szól, aki érdeklődik a processzor architektúrája és az Assembly nyelvű programozás alapjai iránt, mindenekelőtt a szoftvertermékek fejlesztőinek.

    PC architektúra.

A számítógép architektúrája 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 egyedi tulajdonságok csak egy adott számítógépmodellhez tartoznak.

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

    számítógép blokkvázlata;

    az elemekhez való hozzáférés módjai és módjai blokk diagramm SZÁMÍTÓGÉP;

    a nyilvántartások készlete é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 eszközök. Rendszer egysége alaplapból, tápegységből és bővítőcellákból áll kiegészítő táblák. Az alaplap tartalmazza a mikroprocesszort, csak olvasható memóriát (ROM), RAM(RAM) és társprocesszor.

      Regisztrálok.

A mikroprocesszoron belül az információt egy 32 regiszterből álló csoport (16 felhasználó, 16 rendszer) tartalmazza, amelyek többé-kevésbé a programozó számára elérhetőek. Mivel a kézikönyv a 8088-i486 mikroprocesszor programozásával foglalkozik, a leglogikusabb a témát a mikroprocesszor felhasználó számára elérhető belső regisztereinek megvitatá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 egy 32 bites regiszter használatát jelöli. 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 nyilvántartások.

EAX/AX/AH/AL (Akkumulátorregiszter) - akkumulátor. Használható szorzásban és osztásban, I/O műveletekben és egyes karakterláncokon végzett műveletekben.

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 hurokismétlések számának 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. Néhány parancs megköveteli.

Ennek a csoportnak minden regisztere lehetővé teszi az "alsó" részekhez való hozzáférést. 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 karakterlá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 (távolsági index regiszter) - index vevő(befogadó). Az aktuális címet tartalmazza a cél karakterláncban.

A mikroprocesszor architektúrája hardver és szoftver szinten támogatja az adatstruktúrát - a verem. A verem használatához speciális parancsok és speciális regiszterek állnak rendelkezésre. Meg kell jegyezni, hogy a verem a kisebb címek felé van feltöltve.

ESP/SP (veremmutató 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 az Intel mikroprocesszorok RAM felépítésének és használatának sajátosságainak köszönhető. A mikroprocesszoros hardver támogatja a program szerkezeti felépítését, amely a következőkből áll szegmensek. Az elérhető szegmensek megadásához Ebben a pillanatban szegmensregiszterek. A mikroprocesszor a következő típusú szegmenseket támogatja:

    kódszegmens. 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 a DS-regisztert (adatszegmens-regisztert) használjuk - szegmens adatregiszter, amely az aktuális program adatszegmensének címét tárolja.

    Stack szegmens. Ez a szegmens a memória egy régiója, az úgynevezett verem. A mikroprocesszor az alapelv szerint rendezi a veremet - az első "jött", az első "balra". A verem eléréséhez az SS regisztert (veremszegmens regisztert) használjuk - verem szegmensregiszter A, amely a veremszegmens címét tartalmazza.

    További adatszegmens. A feldolgozandó adatok további három adatszegmensben lehetnek. Alapértelmezés szerint az adatok az adatszegmensben vannak. További adatszegmensek használatakor a címüket kifejezetten meg kell adni, speciális szegmens-újradefiniáló előtagokkal a parancsban. A további adatszegmensek címeit az ES, GS, FS regiszterekben (kiterjesztési adatszegmens regiszterek) kell tartalmazniuk.

        Vezérlé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, amelynek utasításai jelenleg a folyamatban vannak. Ez:

EIP/IP parancsmutató regiszter;

    EFLAGS/FLAGS jelzőregiszter.

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

EIP/IP (utasításmutató regiszter) - mutató parancsokat. Az EIP/IP regiszter 32 vagy 16 bit 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 elérhető, de az ugrási utasítások megváltoztatják.

ZÁSZLÓK/ZSZÁSZLÓK (zászlóregiszter) - Regisztráció zászlókat. Bitmélység 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 1-re van beállítva ("jelző beállítva"), ha valamilyen feltétel teljesül, és 0-ra ("jelző törölve") egyébként. Ennek a regiszternek az alsó része teljesen analóg az i8086 FLAGS regiszterével.

1.1.3 Zászlóregiszter

A jelzőregiszter 32 bites, és 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 mikroprocesszorra írt programok végrehajtásakor használt 16 bites FLAGS regisztert jelenti.

Fig.1 A zászlók nyilvántartása

Egyes zászlókat állapotjelzőknek nevezzük; automatikusan módosulnak 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 rácson kívüli bit be van írva a CF-be. A CF a szorzási utasítás jellemzőit is javítja.

OF (túlcsordulásjelző) túlcsorduló zászló. 1-re van állítva, ha egész számok előjellel történő összeadásakor vagy kivonásakor a megengedett értéket meghaladó modulo eredményt kaptunk (a mantissza túlcsordult és "bemászott" az előjelbitbe).

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 eredményez.

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

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

Állapotjelzők:

DF (irányjelző) irányzászló. Beállítja a vonalak pásztázási irányát a string parancsokban: DF=0 esetén a sorok "előre" (elejétől a végéig), DF=1 esetén az ellenkező irányba.

IOPL (bemeneti/kimeneti jogosultsági szint) - I/O jogosultsági szint. A mikroprocesszor védett üzemmódjában az I / O parancsokhoz való hozzáférés szabályozására 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ő. IF=0 esetén a processzor nem válaszol a hozzá érkező megszakításokra, IF=1 esetén a megszakítások blokkolása megszűnik.

TF (csapdajelző) nyom zászló. TF=1 esetén az egyes utasítások végrehajtása után a processzor megszakítást hajt végre (1-es számmal), amelyet a program nyomkövetésére használható hibakereséskor használhatunk.

RF (folytatásjelző) önéletrajz zászló. A hibakeresési regiszterekből származó megszakítások kezelésére használatos.

Virtuális gép (virtuális 8086 mód) - virtuális 8086 zászló. 1 - a processzor virtuális 8086 módban működik 0 - a 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 munkamemória ( 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ímtartomány 0 és 4 GB között van. A memóriakezelési mechanizmus teljes mértékben hardver alapú.

A mikroprocesszor a RAM hardverhasználatának számos modelljét támogatja:

    szegmentált modell. Ebben a modellben a programmemória összefüggő memóriaterületekre (szegmensekre) van felosztva, és maga a program csak az ezekben a szegmensekben lévő 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óriaterületet használjanak, mint amennyi a fizikai memória. Egy Pentium mikroprocesszornál a lehetséges virtuális memória mérete akár 4 TB is lehet.

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 tervezett 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ásával.

    Virtuális 8086 mód. Ebben a módban számos program futtatható az i8086-hoz. Ebben az esetben a 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ános esetben tetszőleges számú szegmensből állhat, de közvetlenül hozzáfér a három főhöz: kódhoz, adathoz és veremhez - és egy-három további adatszegmenshez. operációs rendszer programszegmenseket helyez el a RAM-ban bizonyos fizikai címeken, majd ezeknek a címeknek az értékeit a megfelelő regiszterekbe helyezi. Egy szegmensen belül a program a szegmens kezdeté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ímtartomány 0 és 1 MB között van. A szegmens maximális mérete 64 KB. Amikor 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 felső 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ő tényleges 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, a ennek a memóriaszegmensnek az eleje (a 16*szegmens +offset érték adja a cella abszolút címét). Ha például az 1234h értéket a CS regiszterben tároljuk, 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ó az eltolást, a második pedig a szegmenst tartalmazza, mindegyik szó „fordított” formában van ábrázolva. forma. Például az 1234h:5678h pár a következőképpen írható:| 78 | 56| 34 | 12|.

Ez a fizikai cím kialakításának mechanizmusa lehetővé teszi, hogy a szoftvert áthelyezhetővé tegye, azaz ne függjön a RAM-ban lévő konkrét letöltési címektől.

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 magas szintű nyelveket (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ó memory_model, calling_convention, OS_type, stack_parameter Az OS_type paraméter alapértelmezés szerint OS_DOS, és jelenleg ez a paraméter egyetlen támogatott értéke. 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, ill technikai eszközökkel A, amely az egyik programozási nyelven lévő programot a célnyelv programjává alakítja, amelyet objektumkódnak neveznek. 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="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. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="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="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 Windows operációs rendszerben A Windows operációs rendszer programozása API függvények (Application Program Interface, azaz interfész) használatán alapul szoftveralkalmazás). Számuk eléri a 2000-et. A Windows programja nagyrészt ilyen hívásokból áll. Minden interakció vele külső eszközökés az operációs rendszer erőforrásai általában az ilyen funkciókon keresztül jelentkeznek. 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).

Hívás ablakok jellemzői API A súgófájlban bármely API függvény a függvény_neve típusaként jelenik meg (FA 1, FA 2, FA 3) Típus – visszatérési érték típusa; A FAX a formális argumentumok listája a megjelenésük sorrendjében, például int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ez a funkcióüzenetet és kilépési gomb(oka)t tartalmazó ablakot jelenít meg. 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. A@16

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. A@16: KÖZEL. KÓD START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Üzenet. doboz. A@16 RET END 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