Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

ÜZBEKisztáni NEMZETI EGYETEM MIRZO ULUGBEK NEVE

SZÁMÍTÁSTECHNOLÓGIAI KAR

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

Elkészült:

Taskent 2003.

Előszó.

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

EXE fájlszerkezet (szemantikus elemzés).

Egy COM-fájl szerkezete.

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

Szétszerelő.

Programok.

Előszó

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

^ Az összeállítás nyelve.

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

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

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

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

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

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

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

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

Rizs. 2. Blokkdiagram személyi számítógép

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

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

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

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

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

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

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

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

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

^16 egyedi regiszter;

16 rendszerregiszter.

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

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

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

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

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

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

eip/ip parancsmutató regiszter.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pop DS
pop AX

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

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

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

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

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

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

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

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

^ Assembly nyelvi szintaxis

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

Rizs. 5. Assembler mondatformátum

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

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

Ezeken a rajzokon:

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

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

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

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

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

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

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

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

Jelek?, @, $, _, &;

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

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

A tokenek a következők:

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

^ Assembly nyelvi parancsok.

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

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

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

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

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

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

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

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

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

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

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

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

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

Parancsok (ábécé sorrendben):

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

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

Kiegészítés

^ A parancs vázlata:

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

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

Munka algoritmus:

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

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

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

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

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

Regisztráció plusz regiszter vagy memória:

|000000dw|modregr/rm|

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

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

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

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

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

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

^ A parancs vázlata:

Célja:

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

feladatváltás.

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

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

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

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

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

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

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

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

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

Közvetlen címzés egy szegmensben:

|11101000|disp-low|diep-high|

Közvetett címzés egy szegmensben:

|11111111|mod010r/m|

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

|11111111|mod011r/m|

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

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

CMP
(hasonlítsa össze az operandusokat)

Operandus összehasonlítás

^ A parancs vázlata:

cmp operandus1, operandus2

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

Munka algoritmus:

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

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

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

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

Regisztrált vagy regisztrált memória:

|001110dw|modreg/m|

Azonnali érték AX (AL) regiszterrel:

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

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

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

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

Operandus eggyel csökkentése

^ A parancs vázlata:

dec operandus

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

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

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

Regisztráció: |01001reg|

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

DIV
(Aláíratlan osztás)

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

Parancs séma:

div osztó

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

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

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

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

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

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

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

Objektumkód:

|1111011w|mod110r/m|

INT
(Megszakítás)

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

^ A parancs vázlata:

int megszakítási_szám

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

^ Munka algoritmus:

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

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

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

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

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

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

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

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

Regisztráció: |01000reg|

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

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

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

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

Ugrás, ha a CX/ECX nulla

^ A parancs vázlata:

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

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

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

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

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

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

ha az ellenőrzött állapot

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 végrehajtás aritmetikai műveletek(ADD és ADC - összeadások és összeadások átvitellel, SUB és SBB - kivonások és kivonások kölcsönnel, MUL és IMUL - előjel nélküli és előjeles szorzások, DIV és IDIV - előjel nélküli és előjeles osztások, CMP - összehasonlítások stb.);

l végrehajtás logikai műveletek(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.).

Az assembler parancsok teljes listája megtalálható 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.

Tanfolyami munka

A fegyelem szerint" Rendszer programozá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). Ezekben rendszerprogramok speciális gépi utasításokat használnak, amelyeket nem kell szokásosan használni (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 ezt az egyetlen módja hogy a program elfogadható időn belül eredményt adjon.

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

Az Assembler egy alacsony szintű programozási nyelv, amely a gépi utasítások írásának olyan formátuma, amely kényelmes az emberi észlelés számára.

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 programméret;

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 (speciális utasítások használata, a „vas” műszaki jellemzői);

· 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 strukturális programozási paradigmához);

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 .

Ahhoz, hogy a gép hardver szinten emberi parancsokat hajtson végre, be kell állítani egy bizonyos műveletsort a „nullák és egyesek” nyelvén. Az Assembler asszisztens lesz ebben a kérdésben. Ez egy olyan segédprogram, amely a parancsokat gépi nyelvre fordítja. A program megírása azonban nagyon időigényes és összetett folyamat. Ennek a nyelvnek nem célja fény és egyszerű műveletek. Jelenleg bármely használt programozási nyelv (az Assembler jól működik) lehetővé teszi speciális, a hardver működését nagymértékben befolyásoló, hatékony feladatok írását. A fő cél a mikro-utasítások és kis kódok létrehozása. Ez a nyelv több funkciót biztosít, mint például a Pascal vagy a C.

Az assembly nyelvek rövid leírása

Minden programozási nyelv szintre van osztva: alacsony és magas. Az Assembler „családjának” bármelyik szintaktikai rendszere különbözik attól, hogy egyszerre egyesíti a legelterjedtebb és modern nyelvek előnyeit. Másokhoz az is hozzátartozik, hogy teljes mértékben tudja használni a számítógépes rendszert.

A fordító megkülönböztető jellemzője a könnyű használhatóság. Ebben különbözik azoktól, amelyek csak magas szinten működnek. Ha bármilyen ilyen programozási nyelvet figyelembe veszünk, az Assembler kétszer gyorsabban és jobban működik. Írni bele könnyű program nem fog túl sokáig tartani.

Röviden a nyelv szerkezetéről

Ha általánosságban beszélünk a nyelv működéséről és felépítéséről, akkor biztosan kijelenthetjük, hogy parancsai teljes mértékben összhangban vannak a processzor parancsaival. Vagyis az assembler olyan mnemonikus kódokat használ, amelyek a legkényelmesebbek az ember számára.

Más programozási nyelvektől eltérően az Assembler a memóriacellák írásához címek helyett meghatározott címkéket használ. Ezeket a kódvégrehajtási folyamattal úgynevezett direktívákká fordítják le. Ezek relatív címek, amelyek nem befolyásolják a processzor működését (nem fordítják le gépi nyelvre), de szükségesek a programozási környezet általi felismeréshez.

Minden processzorsornak megvan a sajátja, ebben a helyzetben minden folyamat helyes lesz, beleértve a lefordítottat is.

Az Assembly nyelvnek több szintaxisa van, amelyekről a cikkben lesz szó.

Nyelvprofik

Az assembly nyelv legfontosabb és legkényelmesebb adaptációja az lesz, hogy bármilyen program írható vele a processzorhoz, ami nagyon kompakt lesz. Ha a kód hatalmas, akkor egyes folyamatok át lesznek irányítva ide RAM. Ugyanakkor mindegyik meglehetősen gyorsan és hibamentesen működik, kivéve persze, ha képzett programozó irányítja őket.

Az illesztőprogramok, operációs rendszerek, BIOS, fordítók, tolmácsok stb. mind assembly nyelvű programok.

Gépről gépre fordító disassembler használatakor könnyen megértheti, hogyan működik ez vagy az a rendszerfeladat, még akkor is, ha nincs rá magyarázat. Ez azonban csak akkor lehetséges, ha a programok könnyűek. Sajnos elég nehéz megérteni a nem triviális kódokat.

A nyelv hátrányai

Sajnos a kezdő programozók (és gyakran a szakemberek) nehezen értik meg a nyelvet. Az összeszerelő megköveteli Részletes leírás a szükséges parancsot. Tekintettel arra, hogy gépi utasításokat kell használnia, nő a hibás műveletek valószínűsége és a végrehajtás bonyolultsága.

Azért, hogy még a legtöbbet is leírhassam egy egyszerű program, a programozónak szakképzettnek kell lennie, és tudása kellően magas. Az átlagos szakember sajnos gyakran rossz kódokat ír.

Ha frissítik a platformot, amelyre a program készül, akkor minden parancsot kézzel kell átírni - ezt maga a nyelv írja elő. Az összeszerelő nem támogatja a folyamatok állapotának automatikus szabályozását és az elemek cseréjét.

Nyelvi parancsok

Mint fentebb említettük, minden processzornak saját utasításkészlete van. A legegyszerűbb elemek, amelyeket bármilyen típus felismer, a következő kódok:


Irányelvek használata

A legalacsonyabb szintű mikrokontrollerek programozása a nyelven (az Assembler ezt lehetővé teszi és kiválóan működik) a legtöbb esetben sikeresen végződik. A legjobb, ha korlátozott erőforrással rendelkező processzorokat használ. 32 bites technológiához adott nyelv remekül illik. Gyakran láthat direktívákat a kódokban. Mi ez? És mire használják?

Először is hangsúlyozni kell, hogy az irányelveket nem fordítják le gépi nyelvre. Ezek szabályozzák a fordító működését. A parancsokkal ellentétben ezek a különböző funkciójú paraméterek nem a különböző processzorok, hanem más fordító miatt különböznek. A főbb irányelvek a következőket tartalmazzák:


név eredete

Mi a nyelv neve - "Assembler"? Fordítóról és fordítóról beszélünk, amelyek titkosítják az adatokat. Az Assembler nem jelent mást, mint egy assemblert. A programot nem kézzel állítottuk össze, automata szerkezetet használtunk. Sőt, jelenleg a felhasználók és a szakemberek már törölték a kifejezések közötti különbséget. Az assemblert gyakran programozási nyelveknek nevezik, bár ez csak egy segédprogram.

Az általánosan elfogadott gyűjtőnév miatt egyesek azt a téves feltételezést élik meg, hogy egyetlen alacsony szintű nyelv létezik (vagy szabványos normák rá). Hogy a programozó megértse, milyen struktúrát kérdéses, meg kell adni, hogy melyik platformhoz használjuk ezt vagy azt az assembly nyelvet.

makró eszközök

A viszonylag újkeletű Assembler nyelvek makrólehetőségekkel rendelkeznek. Ezek megkönnyítik a programok írását és futtatását. Jelenlétüknek köszönhetően a fordító sokszor gyorsabban hajtja végre az írott kódot. Feltételes választás létrehozásakor hatalmas parancsblokkot írhatunk, de egyszerűbb a makrók használata. Lehetővé teszik, hogy gyorsan váltson a műveletek között, ha egy feltétel teljesül vagy nem teljesül.

Makrónyelvi direktívák használatakor a programozó Assembler makrókat kap. Néha széles körben használható, néha pedig az funkcionális jellemzői le egy csapatra. Jelenlétük a kódban megkönnyíti a vele való munkát, érthetőbbé és vizuálisabbá teszi. Ennek ellenére óvatosnak kell lennie - bizonyos esetekben a makrók éppen ellenkezőleg, rontják a helyzetet.

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ória_modell, hívási_konvenció, OS_típus, verem_paraméter Alap assembly nyelvű memóriamodellek: Memóriamodell Kódcímzés Adatcímzés operációs rendszer Kód- és adatbeillesztés APRÓ MS-DOS KÖZELÉBEN KICSI MS-DOS KÖZELÉBEN, Windows nem KÖZEPES MESSZI MS-DOS KÖZELÉB, Windows nincs KOMPAKT KÖZEL MS-DOS, Windows nincs NAGY TÁVOLI MS-DOS, Windows nem HATALMAS MS-DOS, Windows NEAR Windows 2000, Windows XP, Windows Allowed FLAT NT NEAR,

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 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, 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. В !} további beállítások projekt varázslót az „Üres projekt” beállításához.

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="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. Kiválasztás szerint jobb gomb a Custom Build Rules menü projektfájljában...

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; FAX – a formális argumentumok listája sorrendben, például int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ez a funkcióü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. [e-mail védett]

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

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

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

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: