Az assembly nyelvi utasításstruktúra tartalmazza. Parancsstruktúra az assembly nyelvű programozásban szinten. Assembly nyelvi adatformátum és parancsstruktúra

Assembly nyelvi parancsok (előadás)

ELŐADÁSTERV

1. A műveletek fő csoportjai.

Pentium.

1. A műveletek fő csoportjai

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

továbbítási műveletek,

aritmetikai műveletek,

logikai műveletek,

műszakos műveletek,

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

bit műveletek,

Programmenedzsment műveletek;

Processzor vezérlési műveletek.

2. Processzorparancsok mnemokódjai Pentium

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

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

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

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

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

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

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

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

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

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

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

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

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

- feltételes ugrási parancsok;

- parancsok programciklusok szervezéséhez;

- megszakítási parancsok;

- funkcióváltási parancsok.

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

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

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

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

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

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

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

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

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

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

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. Maximális hossz Az azonosító 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 műtőben használják Windows rendszer. 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 a végét jelöli forráskód programokat. Az END direktívát követő összes sort figyelmen kívül hagyja.Az END direktíva utáni címke közli a fordítóval annak a fő modulnak a nevét, amelytől a program végrehajtása kezdődik. Ha a program egy modult tartalmaz, akkor az END direktíva utáni címke elhagyható.

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

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="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 OS Windows alatt A Windows operációs rendszer programozása API-függvények (Application Program Interface, azaz szoftveralkalmazási felület) használatán alapul. Számuk eléri a 2000-et. A Windows programja nagyrészt ilyen hívásokból áll. 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. A Windows operációs 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

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 szerkezeti 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.

Szerkezeti 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ő sablonnal:

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ónév] szerkezet_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, egy memóriaterület az összes hosszának összegével szerkezeti elemek.

    é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) ).

Cél szerint a parancsok megkülönböztethetők (zárójelben adunk példákat egy PC-összeszerelő, például az IBM PC parancsainak mnemonikus műveletkódjaira):

l aritmetikai műveleteket hajt végre (ADD és ADC - összeadás és összeadás átvitellel, SUB és SBB - kivonás és kivonás kölcsönnel, MUL és IMUL - előjel nélküli és előjeles szorzás, DIV és IDIV - előjel nélküli és előjeles osztás, CMP - összehasonlítások stb.) ;

l logikai műveletek végrehajtása (VAGY, ÉS, NEM, XOR, TESZT stb.);

l adatátvitel (MOV - küldés, XCHG - csere, IN - belépés a mikroprocesszorba, OUT - kivonás a mikroprocesszorból stb.);

l vezérlés átadása (programágak: JMP - feltétel nélküli elágazás, CALL - eljáráshívás, RET - visszatérés az eljárásból, J* - feltételes elágazás, LOOP - hurokvezérlés stb.);

l karakterláncok feldolgozása (MOVS - átvitelek, CMPS - összehasonlítások, LODS - letöltések, SCAS - szkennelések. Ezeket a parancsokat általában előtaggal (ismétlésmódosító) használják REP;

l programmegszakítások (INT - szoftveres megszakítások, INTO - feltételes megszakítások túlcsorduláskor, IRET - visszatérés megszakításból);

l mikroprocesszoros vezérlés (ST* és CL* - zászlók beállítása és törlése, HLT - stop, WAIT - készenlét, NOP - tétlen stb.).

VAL VEL teljes lista assembler parancsok megtalálhatók a munkákban.

Adatátviteli parancsok

l MOV dst, src - adatátvitel (mozgatás - áthelyezés src-ről dst-re).

Átvitel: egy bájt (ha az src és dst bájt formátumú) vagy egy szó (ha az src és dst szó formátumú) a regiszterek között vagy a regiszter és a memória között, és azonnali értéket ír egy regiszterbe vagy memóriába.

A dst és src operandusoknak azonos formátumúaknak kell lenniük – bájt vagy szó.

Az Src típusa lehet: r (regiszter) - regiszter, m (memória) - memória, i (impedancia) - azonnali érték. A Dst lehet r, m típusú. Az operandusok nem használhatók egy parancsban: rsegm i-vel együtt; két m típusú operandus és két rsegm típusú operandus). Az i operandus egy egyszerű kifejezés is lehet:

mov AX, (152 + 101B) / 15

A kifejezés kiértékelése csak a fordítás során történik. A zászlók nem változnak.

l PUSH src - szó elhelyezése a veremben (push - áttol; tolja a verembe az src-ből). Az src tartalmát a verem tetejére tolja - bármely 16 bites regiszter (beleértve a szegmenst is) vagy két memóriahely, amely 16 bites szót tartalmaz. A zászlók nem változnak;

l POP dst - szó kiemelése a veremből (pop - pop; számolás a veremből dst-ben). Eltávolít egy szót a verem tetejéről, és a dst-be helyezi – bármely 16 bites regiszter (beleértve a szegmenst is) vagy két memóriahelyre. A zászlók nem változnak.

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űtő - a "mit kell tenni" meghatározása;
  • operandus - feldolgozó objektumok meghatározása, „mihez kezdjünk”.

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

címke parancs/irányelv 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.

Példa kódsorok:

Countdb 1 ;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ő karaktereket 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 néhány fordító nem támogatja ezt a karaktert. A fenntartott összeállítási nyelvnevek (irányelvek, operátorok, parancsnevek) nem használhatók címkeként.

A címke első karakterének betűnek vagy speciális karakternek (nem számnak) kell lennie. A címke maximális hossza 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 az utasítás egy műveletet határoz meg, például egy mozgatást (mov) vagy egy hozzáadást (add).

irányelveket

Az assembler számos operátorral rendelkezik, amelyek lehetővé teszik az összeállítás és a lista létrehozásának folyamatát. Ezeket az operátorokat hívják irányelveket . Csak a program összeállításának folyamatában járnak el, és az utasításokkal ellentétben nem generálnak gépi kódokat.

operandusok

Operandus – olyan objektum, amelyen egy gépi parancs vagy egy programozási nyelv operátora végrehajtódik.
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 ;Inkrement 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 karakterlánc egyetlen helyén sem kezdődnie. A program jobb olvashatósága érdekében azonban ajánlatos ezeket egy oszlopba írni.

Az operandusok lehetnek

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

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

Az azonosítók írásának szabályai.

  • Az azonosító egy vagy több karakterből állhat.
  • Karakterké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ó legfeljebb 255 karakter hosszú 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 minden, ami a pontosvessző után és a sor végéig van írva, megjegyzés. 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é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ó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 kódot, adatokat és veremszegmenseket a megfelelő direktívákkal deklaráltan. A szegmensek deklarálása előtt meg kell adnia a memóriamodellt a .MODEL direktíva segítségével.

Példa egy "semmit csináló" programra assembly nyelven:

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

RET
VÉGE START

Ez a program csak egy mikroprocesszor utasítást tartalmaz. Ez a parancs a RET. Ez biztosítja a program helyes leállítá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éhez kapcsolódik.
.686P - 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. A direktíva végén található P betű jelzi a fordítónak, hogy a processzor védett módban fut.
A .MODEL FLAT, az stdcall egy lapos memóriamodell. Ezt a memóriamodellt használják operációs rendszer Ablakok. stdcall
A .DATA egy adatokat tartalmazó programszegmens.
A .CODE egy kódot tartalmazó programblokk.
A START egy címke. Az assemblerben nagy szerepe van a címkéknek, 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 programot a START címkéről kell elindítani.
Minden modulnak 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 elhagyása hibát generál.
Az END direktíva utáni címke közli a fordítóval annak a fő modulnak a nevét, amelybő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