Szegmens regiszterek (16 bitesek)
|
|
- Gyöngyi Ágnes Deákné
- 7 évvel ezelőtt
- Látták:
Átírás
1 Memóriatérkép BIOS (alaplapi) BIOS bővítések (csatolókártyán elhelyezkedő) F000 : FFFF C000 : 0000 B000 : FFFF A000 : : FFFF Felső memória 246 Kbyte (Videó RAM) képernyő megjelenítéséhez szükséges 1000 : : FFFF 0000 : : Kbyte (konvencionális (hagyományos) memória) /az első 10 szegmens/ egy szegmens maximális mérete 64 Kbyte Maximum F000 lehet a szegmenscím, mert: F000 * 16 = F FFFF = FFFFF ami már 20 bites cím Szegmens regiszterek (16 bitesek) CS(Code Segment) utasítások címzéséhez SS(Stack Segment) verem címzéséhez DS(Data Segment) (automatikus) adat terület címzéséhez ES(Extra Segment) másodlagos adat terület címzéséhez Vezérlő regiszterek (16 bitesek) IP(Instruction Pointer) az éppen végrehajtandó utasítás logikai címét tartalmazza a CS által mutatott szegmensben SP (Stack Pointer) a stack-be (verembe) utolsónak beírt elem logika címét tartalmazza az SS által mutatott szegmensben STATUS (SR vagy FLAGS) a processzor állapotát jelző regiszter BP(Base Pointer) a stack indexelt címzéséhez használatos SI(Source Index) a kiindulási (forrás) adat terület indexelt címzéséhez használatos
2 DI(Destination Index) a cél adat terület indexelt címzéséhez használatos Szegmens (6.8. ábra) A programozó számára látható logikai egység. Minden szegmens címtartománya 0-tól valamilyen maximumig terjed. A szegmens tényleges mérete ennél kisebb lehet. A program számára a címtartomány két dimenziós: (szegmens, offset). Általában egy szegmensben csak egyféle dolgok vannak: vagy kód vagy konstans vagy Különböző tárvédelmi lehetőségek: kód: csak végrehajtható, nem írható, nem olvasható, konstans: csak olvasható Szegmentált memóriacímzés: Operatív memória nélkül nem tudunk programokat futtatni egy Neumann-architektúrájú (tárolt programú) számítógépen - valamilyen módon tehát a memóriát el kell érnünk, hogy oda programokat töltsünk be. A memóriához való hozzáférés, mint tevékenység két fázisra osztható: 1; címzés: ekkor meghatározzuk, milyen memóriacímre (cellaként, rekeszként lehet elképzelni) vagyunk kíváncsiak 2; operáció: az adott címre beírunk vagy onnan kiolvasunk egy adatot. Ahhoz, hogy beírjunk egy értéket, tudnunk kell, mekkora helyet foglal a memóriában. Számértékekben kell gondolkodni, mást ugyanis a digitális gépek nem ismernek... A számokat az assembly nyelveken programozók szeretik hexadecimális formában ábrázolni - ez ugyanis kifejezőbb, mint a decimális forma, később látjuk is, miért lesz ez fontos. A hexadecimális számok mögé egy 'h' utótagot írok, vagyis a 12h egy hexa szám, értéke decimálisan tizennyolc. Vegyünk egy példát a memóriában való értékek tárolására. Tegyük fel, hogy három számot szeretnénk eltárolni. Az egyik szám értéke a [0,100] intervallumba tartozik, a második a [-200,+200] tartományba, a harmadik pedig a [ , ] tartományba. Az első intervallumot 7 biten tudjuk ábrázolni, mert 7 biten 128 féle adat fér el, ebbe belefér a [0,100] intervallum. Mi azonban csak kerek címekre, byte határokra írhatunk. Ezen intervallumon tárolt számérték tehát 8 bit helyet foglal a memóriában. Tegyük fel, hogy a hely memóriacíme "0000h". A számolás szerint a következő szám már a "0001h" memóriahelytől fér csak el. Vegyük a következő számot. Értéke a [-200,+200] tartományba eshet, vagyis 401 féle értéket vehet fel. A 401, mint szám tárolásához 9 bitre lesz szükség, mert 2^8 (ejtsd: 2 ad 8, vagyis kettő a nyolcadikon) 256, ez kicsi, 2^9 pedig 512, ez már nagyobb, mint 401. Tudunk 9 bitnyi helyet kicímezni? Nem, 8 bitenként tudunk címezni, vagy annak többszörösén. A "0001h"-s cím tehát már egy 16 bites számra fog mutatni. Ez kétszer 8 bit, vagyis 2 bájt, 0001h + 2 = 0003h, tehát ez lesz a következő szám címe. A harmadik szám értéke a [ , ] tartományba fog esni. Ez összesen lehetőség, ez a szám még 16 biten sem fér el: 2^16 = Ez kevés. Ennek kétszerese , ez 2^17, ez is kevés, ennek kétszerese kell, , vagyis 2^18. Ez elférhetne a 8 bit többszöröse szabály alapján 16+8=24 biten. A szám ugyan elfér, de a processzor csak háromféle számot tud kezelni: 8 bitest (byte), 16 bitest (short integer) és 32
3 bitest (integer). Ezek alapján már tudjuk, hogy egy 32 bites memóriahelyre lesz szükség. Ez 4 bájt, a következő szabad terület memóriacíme tehát 0003h + 4 = 0007h. Említettem, hogy valós módban mindössze 1MB memória érhető el. Tudni kell azonban azt is, hogy a processzor valós módjában a memóriacímzés 16 bites. Itt jön a bökkenő. 16 bittel csak 2^16, vagyis féle cím különböztethető meg. Ez sokkal kevesebb, mint egy megabájt. Erre vezették be a szegmenseket. A szegmensek egymás után 16 bájtonként következnek, mert = 64kB memóriaterület fedhető le, és 1MB osztva 64kB = 16. Vegyünk megint egy példát - három felvonásban. Az elsőben el szeretnénk érni a valós memória 18. bájtját, a másik esetben a 48. bájtot, a harmadikban pedig a es memóriacímet. Tudjuk, hogy a szegmensek 16 bájtonként következnek. A 18-as memóriacímhez tartozó szegmenscím meghatározása a következőképpen történhet: 18-at elosztjuk 16-tal és kapunk 1-et. Egy lesz a szegmenscím: az első szegmensben van a 18-as cím. Mi az osztás maradéka? Kettő, ez lesz az index. Szegmenscím=1, Index=2. Ezt hexadecimálisan szokták jelölni és kettősponttal elválasztva, vagyis "0001h:0002h". Második esetben a 48. bájt kell, osszuk el 48-at 16-tal, 3-at kapunk és nulla a maradék, vagyis a cím 0003h:0000h lesz. Harmadik esetben / 16 = 7.736, vagyis 1E38h, az osztás maradéka 13, vagyis az index 000Dh - tehát a cím 1E38h:000Dh. Most pedig jön a szépség - kicsit másképpen - csak tisztán matematikai alapon. Az index 16 bites, értéktartománya 65536, tehát egy szegmens mérete 64kB. Emiatt a 18. bájtot a 0. szegmens 18 bájtjaként is el lehet érni, a 48-as bájtot pedig a 0. szegmens 48. bájtjaként. Hogyan lehetne akkor a ik bájtot is így, másképpen elérni? Tudjuk, hogy 1 < ( / ) < 2, ez azt jelenti, hogy mivel /16 = 4096, vagyis 4096 féle lehetséges szegmenscím van egy 64kB-os szegmens (memóriablokk) területén, a 4096-edik szegmenscímtől már a következő 64kB is elérhető = , vagyis 4096 = 1000, = E38Dh, tehát a 1000h:E38Dh címen ugyanaz az adat van, mint a korábban kiszámolt 1E38h:000Dh címen. Javaslom a tisztelt olvasónak, fusson újra végig ezen a gondolatmeneten, mert ez a valós módú memóriacímzés módszere és alapvető fontosságú. Aztán nézze jól meg ezt a két párost (1000h:E38Dh) és (1E38h:000Dh), vajon miért is ugyanaz az értékük? Látható, hogy (1E00h:038Dh) és (1E30h:008Dh), de természetesen még (1E31h:007Dh) és (1E10h:028Dh) is ugyanarra a címre mutat. Aki ezt belátja, az érti a szegmentált memóriacímzést.
4 Regiszterek kezelése: Ismert, hogy a regiszterek a processzor futási környezetét alkotják. Hogyan tudjuk feltölteni a regisztereket értékekkel? Egy ilyen feltöltést (adat-)mozgatásnak hívunk, és a MOV utasítást használjuk rá. Először meg kell nevezni az adott regisztert és megmondani, hogy milyen értékkel akarjuk feltölteni. Említettem négy általános célú regisztert. Ezek a regiszterek az EAX, EBX, ECX és az EDX. A jelölés értelme a következő: hajdanában-danában az Intel regiszterek 16 bitesek voltak, de óta 32 bitesek, ez egy kiterjesztés (Extension), ezt jelzi az E betű a regiszterek előtt. Az általános célt a matematikában is használt X, mint változó jelöli. Nem teljesen igaz azonban, hogy mind a négy regiszter általános célú. Vegyük őket sorra. EAX: A valóban általános célú regiszter, a legtöbb műveletet ezzel szokás végezni. EBX: A bázisregiszter, ezt címzéseknél fogjuk használni. ECX: A ciklusregiszter, vagyis ciklusváltozóként használt regiszter. EDX: Data, vagyis adatátvitelre (pl. osztás maradéka) használt regiszter. A régi programokkal és címzésekkel való kompatibilitás miatt megtartották a 16 bites elnevezéseket is, vagyis a valóságban (a hardware-ben) ugyan nem létezik, de nyelvi elemként megmaradt az AX, BX, CX, DX regiszter is - és a későbbiekben ez igaz lesz az indexregiszterekre is. Nézzünk végre példákat. Első pédánkban az EAX regiszterbe 1237ABCEh értéket töltünk, majd ezt átmozgatjuk az EDX regiszterbe, végül ennek alsó 16 bitjét az ECX regiszterbe. ; amit pontosvessző jel után írunk, az megjegyzés mov eax, 1237ABCEh ; mozgasd EAX-be a 1237ABCEh hexa értéket mov edx, eax ; mozgasd EDX-be EAX értékét mov cx, dx ; mozgasd CX-be DX értékét A lényeg, hogy EnX és nx ugyanazt a regisztert jelöli, csak EnX esetében mind a 32 bitjét el tudjuk érni, nx esetében pedig csak az alsó 16 bitet (mert ugye a felső az Extension). Lehetőség van az alsó, 16 bites rész alsó és felső bájtjának elérésére is, ezt nl-nek (low, alacsony) és nh-nak (high, magas) jelölik. Például: EBX(32), BX(16), BL(8), BH(8). mov edx, h mov dl, 0E3h mov dh, 0D7h Remélem, belátható ezek után, hogy EDX értéke 1355D7E3h lesz. Vegyünk észre még valamit - ez már ugyan csupán a szintaktikára vonatkozik - ha a hexadecimális formájú szám betű karakterrel kezdődik, akkor előnullázzuk (például 0E3h). Nos, nézzünk egy kis címzést - immár a gyakorlatban. mov esi, Offset adatok ; "adatok" címke eltolási címe ESI-be mov al, ds:[esi] ; DS:ESI címen található érték AL regiszterbe mov bl, Byte Ptr [adatok] ; Byte jellegű adat BL regiszterbe add esi, 2 ; indexregiszer értékének növelése 2-vel ; ezáltal az indexmutató a memóriában 2 bájttal távolabbi címre fog mutatni mov ecx, ds:[esi] mov dx, Word Ptr [adatok + 4] add esi, 4 mov ebx, ds:[esi]
5 ; egyéb programrészlet adatok: db 01h db 02h db 03h db 04h dw 0AACCh dd 22AACC88h Használtunk végre egy szegmensregisztert és egy indexregisztert is. Hat szegmensregiszterrel rendelkezik az i80386-os processzor, ezek a következők: CS, DS, ES, FS, GS, SS (gépi kód szerinti sorrendben ES, CS, SS, DS, FS, GS). Kódszegmens (CS): az ezen regiszter által meghatározott szegmensben fut a felhasználói folyamat. Adatszegmens (DS): ez a folyamat alapértelmezett adatszegmensének címét tartalmazza. Rövid programoknál a kód és adatszegmens ugyanaz, hiszen felesleges lenne memóriát pazarolni. Az extraszegmens regiszter az ES, ugyanilyen célt szolgálnak az FS és GS regiszterek is, ezek általános céllal használható szegmensjelölők. A verem szegmens címét az SS (Stack Segment) regiszter tartalmazza, ide általában a programok paraméterei, hívási láncok címei, stb. kerülnek. Nézzük az indexregisztereket. Ezek meghatároznak egy memóriahelyet egy adott szegmenscímhez viszonyítva - ezt hívjuk "offset"-nek, vagyis relatív címnek. Utóbbi példaprogramunkban az ESI (Extended Source Index, vagyis forrásindex) regiszter tartalma az "adatok" címke memóriabeli címe volt az adott szegmensen belül. A címke egy elnevezett memóriacím. Az ESI regisztert input (Source Index: forrás index) címzésére használják. Az EDI (D, mint Destination, vagyis cél) regisztert output (kimenet) célokra. Az EBP a bázismutató (Base Pointer), ami általános célokra használható címzésnél. Az ESP a veremmutató (Stack Pointer), ez jelzi, hogy milyen (hány bájt) mélységig jutottunk a program vermében. A Stack Pointer értéke a program futása során csökken, nem nő, mert a verem verem és nem cső... Láthatjuk, hogy a szegmens regiszterekhez tartoznak indexregiszterek, a DS-hez az ESI, az ES, FS és GS-hez az EDI, az SS-hez az ESP és például az EBP... Természetesen a kódszegmenshez is tartozik mutató, ez az EIP, vagyis utasításszámláló (Instruction Pointer), ez jelöli ki a kódszegmensben azt a címkét, ahol a program végrehajtása tart, vagyis EIP mindig a következő utasítás címét tartalmazza. Térjünk vissza a példaprogram elemzéséhez. Először tehát elhelyezi ESI-ben az "adatok" címke memóriacímét, majd AL regiszterbe mozgatja a DS:ESI által kijelölt memóriaterületen található értéket, vagyis 1-et. Azt a műveletet, amikor egy memóriacímről értéket olvasunk ki, vagy oda értéket írunk be, indirekciónak hívjuk. A tömbzárójelek (array brackets: [ és ] jelek) közé írt azonosító jelzi, hogy mivel indexelünk. Ha ez egy regiszter, akkor egyértelmű, hogy a regiszter által jelöljük ki a relatív memóriacímet. Ilyen zárójelben az indexregisztereken kívül az EBX regiszter is szerepelhet még. Amennyiben a tömbzárójelek közé egy elnevezett címke (ezt hívják magaszintű nyelvekben "változó"-nak) azonosítóját írjuk, akkor jelezni kell, hogy milyen típusú adatra mutatunk (PTR - pointer - kulcsszó). A lehetséges típusok: BYTE - például AL, vagy CH esetén, amelyek 8 bites regiszterek WORD - 16 bites regiszetereknél, pl. AX, SI esetén DWORD - double word: duplaszó, vagyis 32 bites, pl. EBP regiszter esetén
6 Menjünk tovább a példában. Ha ESI értékéhez hozzáadunk kettőt ("add esi, 2"), akkor az "adatok" címke után 2 bájttal található memóiacímre fog mutatni ESI. Ott mi található? A db-vel jelölt helyek bájtos helyek, vagyis két bájttal arrébb a 3 érték található. Az ECX regiszter tartalma mi lészen? ECX tudjuk, 32 bites, vagyis ami az aktuális ESI címétől 32 bit, 4 bájt hosszon helyezkedik el, az egy számként bekerül ECX-be. Ez a szám az AACC0403h lesz. Hogy miért? A számok ábrázolása Intel processzoron LITTLE ENDIAN jellegű, vagyis legelöl van a legkisebb helyiérték. Legelöl áll 03, utána 04, majd pedig egy dw short int (16 bites egész) szám, ez bekerül a 32 bites regiszter tetejére, mert ez van leghátul: így épül fel ECX értéke AACC0403h-vá. A következő utasítással DX értéke is 0AACCh lesz, mivel a "mov dx, word ptr [adatok + 4]" az adatok címe után 4 bájttal található címről cseni el az adatot. Megint növeljük ESI értékét, most néggyel, majd az itt található értéket bemozgatjuk az EBX regiszterbe. Ezáltal az a 22AACC88h értékkel töltődik fel. Ugrás és hívás: Az ugrás olyan tevékenység, amellyel a processzor utasításszámlálóját nem a programban soron következő utasításra, hanem egy távolabbi pontra állítjuk. A hívás egy olyan ugrás, amely lehetőséget ad arra, hogy visszatérjünk a kiindulópontba. Nézzünk erre egy példát. egy: jmp negy ketto: mov ecx, 14h harom: ret negy: call ketto ot: mov eax, ecx A "jmp" (jump, ugrás) utasításnak megmondjuk, hogy milyen címet kell beállítani az EIP-be, vagyis az utasításszámlálóba. Ez a cím a "negy" címke címe. Ezáltal a vezérlés a "negy" címke után található utasításra adódik. Azok az utasítások, amelyek az "egy" és a "negy" címke közt találhatóak, nem kerültek végrehajtásra. A "negy" címke után egy call (hívás) utasítás szerepel, amelynek a "ketto" címke címét adjuk át. Ezáltal az EIP regiszter a "ketto" címke címére áll, de még valami más is történik. A verembe mentődik a következő utasítás címe, esetünkben ez az "ot" címke. Minden program részére fenn kell tartani egy veremterületet. Ez maximálisan egy szegmensnyi terület lehet és mint korábban is említettem, arra használható, hogy visszatérési értékeket, paramétereket, stb. helyezzünk el benne, vagyis olyan értékeket, melyeket menteni szeretnénk, hogy később felhasználjuk azokat. A vermet egy olyan zsákként képzelhetjük el, amibe néha bedobálunk kacatokat, amik jelenleg nem kellenek, majd később kiszedjük azokat. Van itt egy fontos szabály: amit utoljára raktunk a verembe, azt vehetjük ki legelőször. A vermet ezért LIFO-nak is hívják: "Last In, First Out". Két művelettel érhetjük el a vermet közvetlenül: "push" (tol) és "pop" (felbukkan). A "push" hatására egy értéket tolhatunk a verembe, ez a verem tetejére kerül, a többi pedig egy egységgel lejjebb. Az egység a processzor valós (REAL) módjában 16 bit. A "pop" utasítással a verem tetején található adat felbukkan, ezáltal a többi érték is egységnyivel feljebb kerül. Elmondhatjuk ezek alapján, hogy a "push" és "pop" utasítások az ESP értékét is változtatják - hiszen mint tudjuk, az ESP regiszter (veremmutató: Stack Pointer) mutatja meg, hol tartunk a veremben. Az ESP értéke jelzi, hogy a veremben lévő értékek látszólag felemelkedtek, vagy lejjebb csúsztak - ugyanis ezek az értékek - természetesen - fizikailag ugyanazon a helyen maradnak, nem másolódnak sehova, csak a verem teteje mozog - ezt a "magasságot" jelzi az ESP. Itt azonban még egy trükk is be lett vetve: a verem a memória fizikai kezelése szempontjából nézve felülről lefelé telítődik, vagyis ami fizikai memóriacím szerint veremterület teteje (ESP=0xFFFFFFFF), az a verem alja és ami a fizikai 0x1 cím, az a verem
7 legteteje. Ha a fizikai 0x1 cím alá, vagy a 0xFFFFFFFF cím fölé megyünk, akkor a verem túlcsordul, logikailag rendre felül-, illetve alulcsordul. Ha egy üres verembe "push" utasítással elhelyezünk egy 16 bites értéket (ez ugye 2 byte), akkor az ESP mutató értéke 0xFFFFFFFD lesz, vagyis kettővel kevesebb, mint ami a verem tetejét jelezné, ha pedig ezt a 16 bites értéket egy "pop" utasítással kiemeljük, akkor az ESP értéke 0xFFFFFFFF lesz. A veremszegmens címét a processzor SS regisztere tartalmazza. Láthatjuk, hogy az ESP egy 32 bites regiszter, vagyis a verem elvileg 2^32 byte (4.3 gigabyte) méretű lehet, valós módban azonban ebből csak a 16 bites SP rész használható. Az SS regiszter azonban mindig 16 bites, hiszen valós módban szegmenscím létezik, mivel 16 bájtonként haladunk 1MB-ig. A processzor védett módja teljesen másképp működik, ott deszkriptorok írnak le egy memóriacímet és mivel egy deszkriptor 8 bájtos, összesen / 8 = 8092 deszkriptor lehet. Térjünk vissza a példához. Tegyük fel, hogy a vezérlés átadódott a "ketto" címkére. Itt egy "mov ecx 0x14" utasítás található, vagyis legyen ECX regiszter értéke 0x14. A következő a "harom" címke, itt egy "ret" utasítás áll, ez a RETURN (visszatérés) rövidítése. Ezen utasítás hatására a processzor kiolvassa a verem tetején lévő számot, és azt, mint visszatérési címet betölti az EIP regiszterbe. A verem tetejére korábban a "call" utasítás helyezett el egy címet, az "ot" címke címét, vagyis most a vezérlés az "ot" címkére fog átadódni. Itt egy "mov eax ecx" utasítás található, ennek hatására most az EAX regiszter tartalma 0x14 lesz. Ha nem hívtuk volna meg a "ketto" címkét, akkor mi lett volna most EAX tartalma? A választ nem tudjuk megadni, ECX értéke ez esetben határozatlan - vagyis ismeretlen - pont annyi, mint amennyit valamelyik korábbi program beállított neki. Ciklusok: Akkor szoktunk ciklusokat szervezni, ha van egy tevékenységünk és az sokszor kell elvégezni. Beszélünk determinisztikus és nem determinisztikus ciklusokról. A determinisztikus ciklus esetében tudjuk, hogy egy adott tevékenységet hányszor kell elvégezni. Magas szintű nyelvekben ezt "for" ciklusnak hívják. Például egy memóriaterület első három bájtját fel kell tölteni 0xAA értékkel. Az Intel Assembly-ben ez úgy kényelmes, hogy megadjuk a feltöltendő memóriacím szegmenscímét és az azon belüli indexet, majd egy tároló utasítást ciklikusan végrehajtunk. mov al, 0AAh ; feltöltendő érték AL-be mov ecx, 0x3 ; ciklusszámláló értéke ECX-be mov edi, Offset terulet ; célterület címe a címregiszterbe cld ; irány flag törlése push cs pop es ; célterület szegmenscíme ES regiszterbe rep ; repeat stosb ; Strore String by Byte ; itt még lehetnek utasítások terulet: db 0 db 0 db 0 Néhány trükk látható: mivel ez egy rövid program, az ES (extra szegmens) regiszter értéke a CS regiszter értékét kapja, ugyanabban a szegmensben van a célterület, mint a programunk kódja. A regiszterértékek másolását most a vermen keresztül a Push-Pop utasításpárral oldottuk meg. A "rep" (REPEAT) ismétlő utasítással lehet egy műveletet ismételni, pontosan annyiszor, amennyit korábban az ECX regiszterben beállítottunk. A "stosb" utasítás ES:EDI címre beírja AL regiszter értékét és az irány (Direction) flag értékének
8 megfelelően növeli, vagy csökkenti EDI-t. Ha a Direction flag értéke igaz, akkor az irány fordított, vagyis EDI értékét csökkenti, ha hamis, akkor az irány normális, növekvő, az EDI értéke nő. Esetünkben az irány flag-et törölni, nullázni kell ("cld" utasítás: CLear Direction flag). A "stosb" utasítással és párjaival később még találkozni fogunk. Tudjuk, hogy a "rep" segítségével egy utasítást tudunk ciklikusan végezni. Hogy oldjuk akkor meg azt, hogy mégiscsak többet ismételjünk egyszerre, vagyis a ciklusmag egy utasításblokkból álljon? Megoldás lehet persze az is, hogy egy külső részben írunk egy sok utasításból álló rutint, s "ret"-tel (visszatérés) fejezzük be és ezt a rutint hívjuk egy utasítással, a "call"-lal ciklikusan. Ezt azonban már függvényhívásnak nevezik, és annak ciklikus formáját kultúrkörökben nem tartják teljesen etikusnak - ha csak nem direkt ez a cél... A megoldás a "loop" utasítás: ezt a ciklusmag végére kell tenni és annyiszor ugrunk el vele a ciklus elejére, amennyit az ECX regiszterben beállítottunk. mov al, 0AAh mov ecx, 3 mov edi, Offset terulet cld push cs pop es feltoltes: stosb loop feltoltes ; itt még lehetnek utasítások terulet: db 0 db 0 db 0 Következzenek hát a nem determinisztikus ciklusok. Ezeknek két fajtája van: az elöltesztelő (while) és a hátultesztelő (do while). Az elöltesztelő ciklusnál a ciklusfejben van egy teszt, ha ez egy feltételt igaznak talál, akkor végrehajtódik a ciklusmag és visszatérünk a ciklusfejhez. Ezért hívjuk ezt while (amíg) ciklusnak. A hátultesztelő ciklusnál először lefut a ciklusmag, majd a cikluslábban egy teszt eldönti, hogy szükséges-e a ciklusmagot újra végrehajtani. Ez más néven a do while (csináld, amíg) ciklus. Nos, íme, egy while ciklus: Ciklusfej: cmp al, 0 je vege ciklusmag: dec al jmp ciklusfej vege: Ha ezt C-nyelven írjuk le, az így néz ki: while( al!= 0x0 ) { --al; } Amíg "al" nem egyenlő 0x0, addig dekrementáld (eggyel csökkentsd) "al" értékét. Ha a program indulásakor "al" értéke nulla volt, akkor be sem lépünk a ciklusba. Ellentétben áll ezzel a következő, do while példa:
9 ciklusmag: dec al cikluslab: cmp al, 0 je vege jmp ciklusmag vege: vagyis do { --al; } while( al!= 0x0 ); Először dekrementáljuk "al" értékét, végül megnézzük, hogy nulla-e. Ha annyi, kilépünk, ha nem, akkor visszaugrunk a ciklusmagra. Feltételek: Mikor állítunk magunk elé feltételeket? Ha esik az eső, viszek esernyőt, ha nem, hát nem. Láthatóan ez egy feltétel, arra használjuk, hogy eldöntsük, mi az optimális viselkedésforma. cmp byte ptr [idojaras], ESO je kell mov eax, 0 jmp tovabb kell: mov eax, ESERNYO tovabb: Tegyük fel, hogy ez egy olyan program részlete, amelyben az "idojaras" címkénél tárolt érték a következő lehet: NAP, ESO, HO, SZEL. Korábban megismerkedtünk a * operátorral, ami arra használatos, hogy egy címkénél található értéket kivegyen (indirekció). A "cmp" utasítás két értéket hasonlít össze úgy, hogy az első értékből kivonja a második értéket, majd beállítja a flag regiszter bizonyos bitjeit. Állítja a ZERO flag-et, akkor lesz IGAZ értékű, ha a kivonás eredménye nullát ad, vagyis a két érték egyezett. Állítja a CARRY (átvitel) flag értékét is, akkor lesz IGAZ, ha az első érték kisebb, mint a második, vagyis a kivonásnak negatív eredménye lesz: kell még értékátvitel (CARRY), hogy nulla legyen. Tegyük fel, hogy az "idojaras" címkénél található érték ESO volt, vagyis esik az eső. Ebben az esetben az összehasonlítás eredménye: "egyenlő". A "je" utasítás használható ilyenkor, "JUMP IF EQUAL" (ugrás, ha egyenlő). A feltételes ugróutasításokkal vigyázni kell, ugyanis maximum 127 bájtot ugorhatunk velük előrehátra! Az az oka ennek a megkötésnek, hogy a feltételes ugróutasítások egy 8 bites relatív címet kapnak, ami a jelenlegi EIP és a megadott cím különbsége. Nyolc biten 2^8, vagyis 256 féle értéket lehet ábrázolni. A processzor megengedi az előre és hátra ugrást, vagyis ezen a 8 biten negatív (előjeles egész) számokat kell ábrázolni. A nyolc bites előjeles egészt előjeles karakter adattípusnak (signed char) hívjuk, értéktartománya [- 128,+127]. Mivel a hasonlítás eredménye "egyenlő" volt, a vezérlés a "kell" címkére adódik át. Itt az EAX regiszter egy "ESERNYO" értéket kap. Vagyis viszünk esernyőt. Ezek után a vezérlés a "tovabb" címkére kerül. Amennyiben az időjárás nem esős, nem ugrunk a "kell" címkére, és EAX regiszter nulla értéket kap, majd elugrunk a "tovabb" címkére. Hogyan lehetséges, hogy ábrázolni tudjuk az ESO, NAP, HO, SZEL, ESERNYO fogalmakat? A gép számokat ismer csupán, vagyis ezek is számértékként vannak meghatározva. Azokat az értékeket, amelyeket elnevezünk, vagyis később már egy egyezményes névvel tudunk elérni, konstans literáloknak nevezzük.
10 A következőkben egy olyan programot fogunk megvizsgálni, amely egy négyszögről eldönti, hogy "a" oldala nagyobb-e, mint 2, és "b" oldala kisebb-e, mint négy. Ha igaz az első feltétel, akkor EAX értéke igaz lesz (nem hamis, vagyis nem nulla), ha a második feltétel igaz, akkor EBX értéke igaz lesz. Ha tehát mindkét feltétel igaz, akkor EAX=EBX=1, ha pedig egyik sem, akkor EAX=EBX=0. a_oldal: cmp byte ptr [a], 2 ja atobb mov eax, 0 jmp b_oldal atobb: mov eax, 1 b_oldal: cmp byte ptr [b], 4 jl bkevesebb mov ebx, 0 jmp vege bkevesebb: mov ebx, 1 vege: A feltételes ugrásoknál meg kell különböztetni előjeles és előjel nélküli (unsigned) feltételt. Előjeles feltételek a "nagyobb, mint" (Greater than), "nagyobb, vagy egyenlő" (Greater or Equal), "alacsonyabb, mint" (Below than), "alacsonyabb, vagy egyenlő" (Below or Equal). Az Assembly nyelvekben ezek tagadása is használható: például "nem nagyobb, mint" (Not Greater than) ugyanazt jelenti, mint az "alacsonyabb, vagy egyenlő". Példánk az előjel nélküli összehasonlításokat mutatja be, "ugrás, ha több, mint kettő" (Jump if Above than) és "ugrás, ha kevesebb, mint négy" (Jump if Less than). Az Assembly alacsony szintű nyelvcsalád. Magas szintű nyelvekben, melyekben "emberi jellegű szavakkal és kifejezésekkel" tudjuk megfogalmazni a programban végrehajtandó tevékenységeket, a feltételek kiértékelését az "if" utasítás végzi. Például C nyelven az első program így hangzik: if( idojaras == ESO ) { eax = ESERNYO; } else { eax = 0; } A második példaprogram ennek megfelelően így néz ki C nyelven: if( a > 2 ) { eax = 1; } else { eax = 0; } if( b < 4 ) { ebx = 1; } else { ebx = 0; } Előfordul, hogy ismerünk több esetet, melyből egy bizonyos időpontban egyszerre csak egy áll elő. Az esetek kiválasztására a magas szintű nyelvekben a "case" (eset) kulcsszó használatos:
11 switch( idojaras ){ case ESO : { eax = ESERNYO; } case HO : { eax = KABAT+SAL+SAPKA+KESZTYU; } case SZEL : { eax = KABAT; } case NAP : { eax = NAPSZEMUVEG; } default : { eax = 0; } // eldonthetetlen idojaras :)) // inkabb nem veszunk fel semmit } Készítsük el ezt a programot is Assembly nyelven. cmp byte ptr [idojaras], ESO je esernyo cmp byte ptr [idojaras], HO je telicucc cmp byte ptr [idojaras], SZEL je fujaszel cmp byte ptr [idojaras], NAP je sutanap default: mov eax, 0 jmp vege esernyo: mov eax, ESERNYO jmp vege telicucc: mov eax, KABAT+SAL+SAPKA+KESZTYU jmp vege fujaszel: mov eax, KABAT jmp vege sutanap: mov eax, NAPSZEMUVEG vege: A CPU rendelkezésére álló memóriaterület olyan nagy, hogy egyetlen regiszter nem tudja végig címezni a teljes memóriát. Ezért egy memóriacím elôállításához mindig két regisztert használunk fel. Az egyiket szegmensregiszternek, a másikat
12 offszet regiszternek hívjuk. Az offszetregiszterek általá-ban a mutató- (BP, IP, SP), vagy az index- (SI, DI) regiszterek. A tényleges memóriacím így a két regiszter segítségével áll elô úgy, hogy a szegmens regiszter értékének tizenhat-szorosához hozzáadódik az offszetregiszter értéke. Például ha a CS regiszter értéke 1A2Ch, az IP regiszter értéke pedig 2B17h, akkor a CS:IP regiszterpár értéke 1CDD7h. Az alábbi ábrán látható, hogy a 16-tal való szorzást egy hexadecimális jeggyel való balra léptetéssel helyettesíthetjük. Fizikai cím = SZEGMENS*16 + OFFSET 1 A 2 C 2 B C D D 7 Legyen például a szegmenscím 0040h, az offset 0002h. Ekkor a cím így irható fel : 0040:0002. Ebben az esetben a szegmenscímet 16-tal szorozva 0400h értéket kapunk. Ehhez hozzáadva a 0002h értéket 0402h fizikai cím adódik. A memóriacímek alkotásához a lehetséges offszet-regisztereknek van egy alapértelmezett szegmensregiszter párja. Az alábbi táblázat mutatja, hogy mely offszetregiszterhez mely szegmensregiszter tartozik alapértelme-zésben. SI, DI: IP: BP, SP: DS CS SS
13 A CPU SS regisztere kijelöli a memória egy 64K-s darabját (szegmensét) úgy, hogy az SS éppen aktuális értéke mellett az SP értéket változtatva milyen memóriacímeket érhetünk el. Ha pl. az SS értéke 1234h, akkor a verem szegmens (stack segment) a memória 1234h:0000h-tól 1234:FFFFh-ig terjedô része. A memóriának ezt a szegmensét veremnek nevezzük. A verembe adatokat lehet berakni, és onnan kivenni úgy, hogy mindig a legutoljára berakott értéket vesszük ki. A verem szegmensen belül az SP regiszter mindig az utoljára berakott adatra mutat. Ha újabbat akarunk berakni, akkor elôször bekerülô adat méretével csökkentjük az SP értékét, majd az SS:SP címre beírjuk az adatot. Ezt végzi a PUSH utasítás. Ha viszont adatot akarunk kivenni a verembôl, akkor elôször kivesszük az SS:SP által mutatott címrôl az adatot, majd a megfelelô mennyiséggel megnöveljük az SP értékét. Ezt végzi a POP utasítás. A verem tehát magasabb címtôl kezdve telitôdik, és mindig páros darab byte kerülhet bele és belôle ki. Például tegyük fel, hogy az AX, BX regiszterek tartalma rendre 0001h, 0002h, az SP értéke pedig FFF0h, és az alábbi utasításokat hajtjuk végre: PUSH AX PUSH BX POP AX POP BX Ekkor az alábbi módon alakulnak a memória- és regiszter értékek (xx: tetszôleges érték): Kezdetben: SS:FFECh: xx SS:FFEEh: xx SP-> SS:FFF0h: xx A PUSH AX után (1): SS:FFECh: xx SP-> SS:FFEEh: 0001h SS:FFF0h: xx
14 A POP AX után (3): A PUSH BX után (2): SP-> SS:FFECh: 0002h SS:FFEEh: 0001h SS:FFF0h: xx SS:FFECh: 0002h SP-> SS:FFEEh: 0001h SS:FFF0h: xx és AX tartalma 0002h. A POP BX után (4): SS:FFECh: 0002h SS:FFEEh: 0001h SP-> SS:FFF0h: xx és BX tartalma 0001h.
15 A verem működése késôbb még fontos szerepet fog játszani. A CPU a következôképpen működik. 1. A CS:IP regiszterpár által mutatott helyrôl kiolvassa az éppen végrehajtandó utasítás kódját. 2. A kódból meghatározza, hogy hány byte-nyi paraméter tartozik még az utasításhoz, ennyi byte-ot kiolvas a kód utáni területrôl. Ezek lesznek az utasítás operandusai. 3. Végrehajtja a kód által meghatározott utasítást a beolvasott operandusokkal. 4. Növeli a CS:IP regiszter értékét annyival, amennyi byte volt a teljes utasítás operandusokkal együtt. Do Repeat Kód:=Kiolvas(CS:IP) For i:=1 To Paraméterek_Száma[Kod] Operandusok[i]:=Kiolvas(CS:IP+i) Végrehajt(Kód,Operandusok) (CS:IP) := (CS:IP)+Hossz[Kód] Until Áramszünet Megjegyzés: A fenti algoritmus csak vázlat, ugyanis vannak olyan utasítások, amelyek kódja nem egy, hanem két byte-os. Ezen kívül a vezérlésátadó utasítások működése is "sántít".
16 típus hány bájton tárolódik Boolean 1 Byte 1 Shortint 1 Char 1 Word 2 Integer 2 Longint 4 Real 6 String[n] n+1 String 256 Kövessük végig a leírtakat egy példán. Tekintsük az alábbi unit-ból és főprogramból álló Pascal programot, és a memóriabeli elhelyezkedését illusztráló ábrát!
17 Unit Seged; Interface Var B1:Byte; Procedure Elj3; Implementation Procedure Elj3; Var B2:Byte; Begin {...} End; { } BEGIN B1:=5; END. Program FoPrg; Uses Seged; Var B3:Byte; { } Procedure Elj1; Begin {...} End; { } Procedure Elj2; Far; Begin {...} End; { } BEGIN Elj1; Elj3; B3:=7; END. A felhasznált unit és a főprogram A memória vázlata Amint az a memória vázlatából is látszik, a főprogram moduljában definiált két eljárás és maga a főprogram egy közös kódszegmensbe kerül, a unit eljárása és annak a főprogramja pedig még egy kódszegmensbe. Ha lennének még további modulok is, akkor azok is újabb és újabb kódszegmensekbe kerülnének. Jól látszik az ábrából, hogy a főprogram a unit eljárása más szegmensben van, ezért csak távoli (far) eljáráshívással hívható.
18
A 32 bites x86-os architektúra regiszterei
Memória címzési módok Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)
Részletesebbentalálhatók. A memória-szervezési modell mondja meg azt, hogy miként
Memória címzési módok Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről) a program utasításai illetve egy utasítás argumentumai a memóriában találhatók. A memória-szervezési
RészletesebbenAdatelérés és memóriakezelés
Adatelérés és memóriakezelés Jelen nayagrészben az Intel x86-os architektúrára alapuló 32 bites processzorok programozását tekintjük. Egy program futása során (legyen szó a program vezérléséről vagy adatkezelésről)
RészletesebbenProgramozás alapjai. 10. előadás
10. előadás Wagner György Általános Informatikai Tanszék Pointerek, dinamikus memóriakezelés A PC-s Pascal (is) az IBM PC memóriáját 4 fő részre osztja: kódszegmens adatszegmens stackszegmens heap Alapja:
RészletesebbenA számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni.
Példák számok kiírására A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni. Decimális számok kiírása Az alábbi
RészletesebbenMi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása
Mi az assembly Gyakorlatias assembly bevezető Fordítóprogramok előadás (A, C, T szakirány) programozási nyelvek egy csoportja gépközeli: az adott processzor utasításai használhatóak általában nincsenek
RészletesebbenMáté: Assembly programozás
Dr. Máté Eörs docens Képfeldolgozás és Számítógépes Grafika Tanszék Árpád tér 2. II. em. 213 6196, 54-6196 (6396, 54-6396) http://www.inf.u-szeged.hu/~mate Tantárgy leírás: http://www.inf.u-szeged.hu/oktatas/kurzusleirasok/
RészletesebbenDigitális rendszerek. Utasításarchitektúra szintje
Digitális rendszerek Utasításarchitektúra szintje Utasításarchitektúra Jellemzők Mikroarchitektúra és az operációs rendszer közötti réteg Eredetileg ez jelent meg először Sokszor az assembly nyelvvel keverik
RészletesebbenBalaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.
Balaton Marcell Balázs Assembly jegyzet Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született. 1. Regiszterek Regiszterek fajtái a. Szegmensregiszterek cs (code):
RészletesebbenAritmetikai utasítások I.
Aritmetikai utasítások I. Az értékadó és aritmetikai utasítások során a címzési módok különböző típusaira látunk példákat. A 8086/8088-as mikroprocesszor memóriája és regiszterei a little endian tárolást
RészletesebbenArchi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz
Archi2 Gyak (Processzorok Utasításszintű Kezelése) 2014 ősz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI
Részletesebben1. Az utasítás beolvasása a processzorba
A MIKROPROCESSZOR A mikroprocesszor olyan nagy bonyolultságú félvezető eszköz, amely a digitális számítógép központi egységének a feladatait végzi el. Dekódolja az uatasításokat, vezérli a műveletek elvégzéséhez
RészletesebbenStack Vezérlés szerkezet Adat 2.
Stack Vezérlés szerkezet Adat 2. Kód visszafejtés. Izsó Tamás 2013. november 14. Izsó Tamás Stack Vezérlés szerkezet Adat 2./ 1 Változó típusú paraméterekátadása 1. #include < s t d i o. h> int64 myfunc
RészletesebbenAssembly. Iványi Péter
Assembly Iványi Péter További Op. rsz. funkcionalitások PSP címének lekérdezése mov ah, 62h int 21h Eredmény: BX = PSP szegmens címe További Op. rsz. funkcionalitások Paraméterek kimásolása mov di, parameter
RészletesebbenProcesszorok Utasításszintű Kezelése tavasz
Processzorok Utasításszintű Kezelése 2014 tavasz Ajánlott irodalom Agárdi Gábor: Gyakorlati Assembly, LSI Oktatóközpont, 1996, ISBN 963 577 117 7 Agárdi G.: Gyakorlati Assembly haladóknak, LSI oktatóközpont,
RészletesebbenParaméter átadás regisztereken keresztül
Eljárások paramétereinek átadási módjai Az eljárások deklarációjánál nincs mód arra, hogy paramétereket adjunk meg, ezért más, közvetett módon tudunk átadni paramétereket az eljárásoknak. Emlékeztetőül:
RészletesebbenAssembly. Iványi Péter
Assembly Iványi Péter Miért? Ma már ritkán készül program csak assembly-ben Általában bizonyos kritikus rutinoknál használják Miért nem használjuk? Magas szintű nyelven könnyebb programozni Nehéz más gépre
RészletesebbenAssembly utasítások listája
Assembly utasítások listája Bevezetés: Ebben a segédanyagban a fontosabb assembly utasításokat szedtem össze. Az utasítások csoportosítva vannak. A fontos kategóriába azok az utasítások tartoznak, amiknek
RészletesebbenAssembly Rekurzív függvények, EXE, C programok. Iványi Péter
Assembly Rekurzív függvények, EXE, C programok Iványi Péter Algoritmusok előadás Rekurzív függvény FÜGGVÉNY nyomtat(n) print n HA n!= 0 nyomtat(n-1) ELÁGAZÁS VÉGE FÜGGVÉNY VÉGE Rekurzív függvény org 100h
RészletesebbenAssembly Címzési módok. Iványi Péter
Assembly Címzési módok Iványi Péter Gépi kód Gépi kód = amit a CPU megért 1-13 byte hosszúak lehetnek az utasítások Kb. 20 000 variációja van a gépi kódú utasításoknak Számítógép architektúrától függ Feszültség
RészletesebbenAssembly programozás levelező tagozat
Assembly programozás levelező tagozat Szegedi Tudományegyetem Képfeldolgozás és Számítógépes Grafika Tanszék 2011-2012-2 Tematika Assembly nyelvi szint. Az Intel 8086/88 regiszter készlete, társzervezése,
Részletesebbenassume CS:Code, DS:Data, SS:Stack Start: xor di, di mov si, 1 Torles int 10h mov dl, 40 xor bh, bh mov ah, 02h Kesleltet int 16h
Fealadat3: labda.asm Feladat meghatározása A program célja az assembly rutinok időzítési lehetőségeinek bemutatása. Az időzítés az AH00, INT1Ah funkció segítségével történik. A program egy labda leesését
RészletesebbenGyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék
Gyakorló feladatok Számrendszerek: Feladat: Ábrázold kettes számrendszerbe a 639 10, 16-os számrendszerbe a 311 10, 8-as számrendszerbe a 483 10 számot! /2 Maradék /16 Maradék /8 Maradék 639 1 311 7 483
Részletesebben2016/08/31 02:45 1/6 Hardver alapok
2016/08/31 02:45 1/6 Hardver alapok < Hardver Hardver alapok Szerző: Sallai András Copyright Sallai András, 2011, 2013, 2014 Licenc: GNU Free Documentation License 1.3 Web: http://szit.hu Bevezetés A számítógépet
RészletesebbenMutatók és mutató-aritmetika C-ben március 19.
Mutatók és mutató-aritmetika C-ben 2018 március 19 Memória a Neumann-architektúrában Neumann-architektúra: a memória egységes a címzéshez a természetes számokat használjuk Ugyanabban a memóriában van:
RészletesebbenAssembly Utasítások, programok. Iványi Péter
Assembly Utasítások, programok Iványi Péter Assembly programozás Egyszerű logikán alapul Egy utasítás CSAK egy dolgot csinál Magas szintű nyelven: x = 5 * z + y; /* 3 darab művelet */ Assembly: Szorozzuk
Részletesebbenassume CS:Code, DS:Data, SS:Stack Start mov dl, 100 mov dh, 100 push dx Rajz
Feladat5: rajzolo.asm Feladat meghatározása A feladat célja bemutatni egy egyszerű grafikai program segítségével a közvetlen címzést (grafikus VGA 320*200). A program a kurzor mozgató gombok segítségével
RészletesebbenVezérlési szerkezetek
Vezérlési szerkezetek Szelekciós ok: if, else, switch If Segítségével valamely ok végrehajtását valamely feltétel teljesülése esetén végezzük el. Az if segítségével valamely tevékenység () végrehajtását
RészletesebbenProgramozás alapjai. 5. előadás
5. előadás Wagner György Általános Informatikai Tanszék Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk
RészletesebbenSzámítógépek felépítése
Számítógépek felépítése Emil Vatai 2014-2015 Emil Vatai Számítógépek felépítése 2014-2015 1 / 14 Outline 1 Alap fogalmak Bit, Byte, Word 2 Számítógép részei A processzor részei Processzor architektúrák
RészletesebbenA hibát az alábbi Python program segítségével tudjuk előidézni:
Bevezető Az ismertetésre kerülő biztonsági hiba 0day kategóriába tartozik, ezért sem a termék, sem a teljes hiba kihasználását lehetővé tevő kód bemutatása nem történik meg. A leírás célja az alkalmazott
RészletesebbenAdatszerkezetek Tömb, sor, verem. Dr. Iványi Péter
Adatszerkezetek Tömb, sor, verem Dr. Iványi Péter 1 Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2 Adat típusa Az adatot
RészletesebbenMemóriagazdálkodás. Kódgenerálás. Kódoptimalizálás
Kódgenerálás Memóriagazdálkodás Kódgenerálás program prológus és epilógus értékadások fordítása kifejezések fordítása vezérlési szerkezetek fordítása Kódoptimalizálás L ATG E > TE' E' > + @StPushAX T @StPopBX
Részletesebben2017/12/16 21:33 1/7 Hardver alapok
2017/12/16 21:33 1/7 Hardver alapok < Hardver Hardver alapok Szerző: Sallai András Copyright Sallai András, 2011, 2013, 2014 Licenc: GNU Free Documentation License 1.3 Web: http://szit.hu Bevezetés A számítógépet
RészletesebbenProgramozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r
Programozás alapjai (GKxB_INTM023) Széchenyi István Egyetem, Gy r 2019. augusztus 29. Feladat: írjuk ki az els 10 természetes szám négyzetét! #i n c l u d e i n t main ( v o i d ) { p r
RészletesebbenSZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1
INFORMATIKAI RENDSZEREK ALAPJAI (INFORMATIKA I.) 1 NEUMANN ARCHITEKTÚRÁJÚ GÉPEK MŰKÖDÉSE SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1 Ebben a feladatban a következőket fogjuk áttekinteni: Neumann rendszerű számítógép
RészletesebbenAlgoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek
Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek Tömb Ugyanolyan típusú elemeket tárol A mérete előre definiált kell legyen és nem lehet megváltoztatni futás során Legyen n a tömb mérete. Ekkor:
RészletesebbenSzegmentálás. Memória kezelési stratégia mely a felhasználó nézőpontját támogatja Például:
Szegmentálás 1 Szegmentálás Memória kezelési stratégia mely a felhasználó nézőpontját támogatja Például: Egy program szegmensekből áll Mindegyik szegmens külön címtér Egy eljárás nullás címen kezdődik
RészletesebbenJava II. I A Java programozási nyelv alapelemei
Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak
RészletesebbenAz assembly nyelv sor-orientált nyelv, tehát minden sorba pontosan egy utasítás kerül. Egy sor mezőkből áll a következőképpen:
Informatika szigorlat 16-os tétel: Az assembly nyelvek tulajdonságai és fordítása Az assembly nyelv tulajdonképpen a gépi kód szimbolikus megfelelője, azért jött létre, hogy könnyebben lehessen programozni
RészletesebbenMikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység
Mikroprocesszor CPU C Central Központi P Processing Számító U Unit Egység A mikroprocesszor általános belső felépítése 1-1 BUSZ Utasítás dekóder 1-1 BUSZ Az utasítás regiszterben levő utasítás értelmezését
RészletesebbenA kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...
A kódgenerálás helye a fordítási folyamatban Forrásprogram Forrás-kezelő (source handler) Kódgenerálás I. (kifejezések és vezérlési szerkezetek) Fordítóprogramok előadás (A,C,T szakirány) 2008. őszi félév
RészletesebbenAdatok ábrázolása, adattípusok
Adatok ábrázolása, adattípusok Összefoglalás Adatok ábrázolása, adattípusok Számítógépes rendszerek működés: információfeldolgozás IPO: input-process-output modell információ tárolása adatok formájában
RészletesebbenSzoftvertervezés és -fejlesztés I.
Szoftvertervezés és -fejlesztés I. Operátorok Vezérlési szerkezetek Gyakorlás 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik.
RészletesebbenOccam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
Részletesebben6. fejezet: Ciklusok
6. fejezet: Ciklusok Mint a nyelvekben általában, itt is léteznek ciklusok. Az alapvető három ciklus-típus: elöltesztelő, hátultesztelő és számláló. Lássuk ezeket sorban! Elöltesztelő = while. A while
RészletesebbenKarunkról Kari digitális könyvtár
. előadás Jegyzet www.inf.elte.hu Karunkról Kari digitális könyvtár i az assembly? gépi kód: a számítógép által közvetlenül értelmezett és végrehajtott jelsorozat assembly: a gépi kód emberek számára könnyen
RészletesebbenMintavételes szabályozás mikrovezérlő segítségével
Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés
RészletesebbenB I T M A N B I v: T M A N
Műszaki informatika Tesztek+Megoldások B I v: T 2015.04.19 M A N 1/42 Tesztek + Megoldások Alapfogalmi kitérő kérdéssor IPA kérdéssor CPA kérdéssor 2/42 Ellenőrző kérdések 1. 1. Melyik Neumann elv következménye
RészletesebbenAritmetikai utasítások
Aritmetikai utasítások Az értékadó és aritmetikai utasítások során a címzési módok különböző típusaira látunk példát. A 8086/8088-as processzor memóriája és regiszterei a little endian tárolást követik,
RészletesebbenProgramozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.10.. -1- Mit tudunk már? Típus fogalma char, int, float,
RészletesebbenKészítette: Nagy Tibor István
Készítette: Nagy Tibor István A változó Egy memóriában elhelyezkedő rekesz Egy értéket tárol Van azonosítója (vagyis neve) Van típusa (milyen értéket tárolhat) Az értéke értékadással módosítható Az értéke
RészletesebbenVáltozók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):
Python Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása alatt
RészletesebbenMit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Mit tudunk már? Típus fogalma char, int, float, double változók deklarációja operátorok (aritmetikai, relációs, logikai,
RészletesebbenA számítógép alapfelépítése
Informatika alapjai-6 számítógép felépítése 1/8 számítógép alapfelépítése Nevezzük számítógépnek a következő kétféle elrendezést: : Harvard struktúra : Neumann struktúra kétféle elrendezés alapvetően egyformán
RészletesebbenMemóriakezel. riakezelés s I. A memória címzése; A memória felosztása; Abszolút változó (rádefiniálás); Memóriatömbök. dr.
Memóriakezel riakezelés s I. A memória címzése; A memória felosztása; Abszolút változó (rádefiniálás); Memóriatömbök. Készítette: dr. Nyári Tibor Emlékeztető! A memória címzc mzése: A memóri riát byte-onk
Részletesebben5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix
2. Adattípusonként különböző regisztertér Célja: az adatfeldolgozás gyorsítása - különös tekintettel a lebegőpontos adatábrázolásra. Szorzás esetén karakterisztika összeadódik, mantissza összeszorzódik.
RészletesebbenAdatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája
Adatszerkezetek Összetett adattípus Meghatározói: A felvehető értékek halmaza Az értékhalmaz struktúrája Az ábrázolás módja Műveletei Adatszerkezet fogalma Direkt szorzat Minden eleme a T i halmazokból
Részletesebben1. ábra: Perifériára való írás idődiagramja
BELÉPTETŐ RENDSZER TERVEZÉSE A tárgy első részében tanult ismeretek részbeni összefoglalására tervezzük meg egy egyszerű mikroprocesszoros rendszer hardverét, és írjuk meg működtető szoftverét! A feladat
RészletesebbenIntel x86 utasításkészlet
Intel x86 utasításkészlet Kód visszafejtés. Izsó Tamás 2013. október 31. Izsó Tamás Intel x86 utasításkészlet/ 1 Section 1 Intel mikroprocesszor Izsó Tamás Intel x86 utasításkészlet/ 2 Intel mikroprocesszor
RészletesebbenSzámítógépek felépítése, alapfogalmak
2. előadás Számítógépek felépítése, alapfogalmak Lovas Szilárd, Krankovits Melinda SZE MTK MSZT kmelinda@sze.hu B607 szoba Nem reprezentatív felmérés kinek van ilyen számítógépe? 2 Nem reprezentatív felmérés
RészletesebbenInformatika érettségi vizsga
Informatika 11/L/BJ Informatika érettségi vizsga ÍRÁSBELI GYAKORLATI VIZSGA (180 PERC - 120 PONT) SZÓBELI SZÓBELI VIZSGA (30 PERC FELKÉSZÜLÉS 10 PERC FELELET - 30 PONT) Szövegszerkesztés (40 pont) Prezentáció-készítés
RészletesebbenSzámítógép Architektúrák
Számítógép Architektúrák Utasításkészlet architektúrák 2015. április 11. Budapest Horváth Gábor docens BME Hálózati Rendszerek és Szolgáltatások Tsz. ghorvath@hit.bme.hu Számítógép Architektúrák Horváth
RészletesebbenBevezetés a számítástechnikába
Bevezetés a számítástechnikába, Címzési módok, Assembly Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék foa@almos.vein.hu 2010. november 2/9. ú utasítás
RészletesebbenBASH script programozás II. Vezérlési szerkezetek
06 BASH script programozás II. Vezérlési szerkezetek Emlékeztető Jelölésbeli különbség van parancs végrehajtása és a parancs kimenetére való hivatkozás között PARANCS $(PARANCS) Jelölésbeli különbség van
RészletesebbenMechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe
Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével
RészletesebbenA regiszterek az assembly programozás változói. A processzor az egyes mőveleteket kizárólag regiszterek közremőködésével tudja végrehajtani.
1. Regiszterek A regiszterek az assembly programozás változói. A processzor az egyes mőveleteket kizárólag regiszterek közremőködésével tudja végrehajtani. Általános célú regiszterek AX akkumulátor: aritmetikai
RészletesebbenA Számítógépek felépítése, mőködési módjai
Mechatronika, Optika és Gépészeti Informatika Tanszék Kovács Endre tud. Mts. A Számítógépek felépítése, mőködési módjai Mikroprocesszoros Rendszerek Felépítése Buszrendszer CPU OPERATÍV TÁR µ processzor
RészletesebbenVáltozók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):
Javascript Változók Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai): Név Érték Típus Memóriacím A változó értéke (esetleg más attribútuma is) a program futása
RészletesebbenA programozás alapjai
A programozás alapjai Változók A számítógép az adatokat változókban tárolja A változókat alfanumerikus karakterlánc jelöli. A változóhoz tartozó adat tipikusan a számítógép memóriájában tárolódik, szekvenciálisan,
RészletesebbenA C# programozási nyelv alapjai
A C# programozási nyelv alapjai Tisztán objektum-orientált Kis- és nagybetűket megkülönbözteti Ötvözi a C++, Delphi, Java programozási nyelvek pozitívumait.net futtatókörnyezet Visual Studio fejlesztőkörnyezet
RészletesebbenMáté: Számítógép architektúrák
A mikroprogram Mic 1: 4.. ábra. 51x3 bites vezérlőtár a mikroprogramnak, MPC (MicroProgram Counter): mikroprogram utasításszámláló. MIR (MicroInstruction Register): mikroutasítás regiszter. Az adatút ciklus
RészletesebbenAdatszerkezetek 1. Dr. Iványi Péter
Adatszerkezetek 1. Dr. Iványi Péter 1 Adat Adat minden, amit a számítógépünkben tárolunk és a külvilágból jön Az adatnak két fontos tulajdonsága van: Értéke Típusa 2 Adat típusa Az adatot kódoltan tároljuk
RészletesebbenJava II. I A Java programozási nyelv alapelemei
Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve
RészletesebbenPE/COFF fájl formátum
PE/COFF fájl formátum Kód visszafejtés. Izsó Tamás 2013. december 5. Izsó Tamás PE/COFF fájl formátum/ 1 Szimbólumtábla A programozási nyelvekben az típusokra, adatokra, függvényekre, ugrási címekre szimbólikus
RészletesebbenMáté: Assembly programozás
Szegmens, szegmens csoport sz_név SEGMENT aling_type combine_type osztály... szegmens sz_név ENDS sz_név a szegmens (szelet) neve. A fordító az azonos nevű szegmens szeleteket úgy tekinti, mintha folyamatosan,
RészletesebbenJárműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás A tárgy órái Előadás hetente (St101) csüt. 8:15 Bécsi Tamás C elmélet Ajánlott irodalom Dennis Ritchie: A C programozási nyelv Gyakorlat hetente
RészletesebbenDSP architektúrák dspic30f család
DSP architektúrák dspic30f család A Microchip 2004 nyarán piacra dobta a dspic30f családot, egy 16 bites fixpontos DSC. Mivel a mikróvezérlők tantárgy keretén belül a PIC családdal már megismerkedtetek,
RészletesebbenSZÁMÍTÓGÉP ARCHITEKTÚRÁK
SZÁMÍTÓGÉP ARCHITEKTÚRÁK Kártyás ajtónyitó tervezése Horváth Gábor BME Hálózati Rendszerek és Szolgáltatások Tanszék ghorvath@hit.bme.hu, belso@hit.bme.hu Budapest, 2018-02-19 Hálózati Rendszerek és Szolgáltatások
RészletesebbenC memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.
C memóriakezelés Ez a kis segédanyag az adatszerkezetek órán használt eszközök megértését hivatott elősegíteni. A teljesség igénye nélkül kerül bemutatásra a mutató típus és a dinamikus memóriakezelés.
RészletesebbenVerem Verem mutató 01
A számítástechnikában a verem (stack) egy speciális adatszerkezet, amiben csak kétféle művelet van. A berak (push) egy elemet a verembe rak, a kivesz (pop) egy elemet elvesz a verem tetejéről. Mindig az
RészletesebbenHardverközeli programozás 1 1. gyakorlat. Kocsis Gergely 2015.02.17.
Hardverközeli programozás 1 1. gyakorlat Kocsis Gergely 2015.02.17. Információk Kocsis Gergely http://irh.inf.unideb.hu/user/kocsisg 2 zh + 1 javító (a gyengébbikre) A zh sikeres, ha az elért eredmény
RészletesebbenBevezetés a C++ programozásba
Bevezetés a C++ programozásba A program fogalma: A program nem más, mint számítógép által végrehajtható utasítások sorozata. A számítógépes programokat különféle programnyelveken írhatjuk. Ilyen nyelvek
Részletesebben2. Fejezet : Számrendszerek
2. Fejezet : Számrendszerek The Architecture of Computer Hardware and Systems Software: An Information Technology Approach 3. kiadás, Irv Englander John Wiley and Sons 2003 Wilson Wong, Bentley College
Részletesebben1. Alapok. #!/bin/bash
1. oldal 1.1. A programfájlok szerkezete 1. Alapok A bash programok tulajnképpen egyszerű szöveges fájlok, amelyeket bármely szövegszerkesztő programmal megírhatunk. Alapvetően ugyanazokat a at használhatjuk
RészletesebbenKészítette: Nagy Tibor István
Készítette: Nagy Tibor István Operátorok Műveletek Egy (vagy több) műveleti jellel írhatók le A műveletet operandusaikkal végzik Operátorok fajtái operandusok száma szerint: egyoperandusú operátorok (pl.:
RészletesebbenProgramozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r
Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. február 18. Minimum és maximumkeresés u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t
RészletesebbenVezérlésfolyam gráf és X86 utasításkészlet
Vezérlésfolyam gráf és X86 utasításkészlet Kód visszafejtés. Izsó Tamás 2016. november 3. Izsó Tamás Vezérlésfolyam gráf és X86 utasításkészlet / 1 Intervallum algoritmus Procedure Intervals(G={N, E, h})
RészletesebbenObjektumorientált Programozás III.
Objektumorientált Programozás III. Vezérlési szerkezetek ismétlés Matematikai lehetőségek Feladatok 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő
RészletesebbenMáté: Számítógép architektúrák
MPC új tartalma, JMPC JMPC esetén MPC 8 alacsonyabb helyértékű bitjének és MR 8 bitjének bitenkénti vagy kapcsolata képződik MPC-ben az adatút ciklus vége felé (MR megérkezése után). Ilyenkor Addr 8 alacsonyabb
RészletesebbenProgramozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
RészletesebbenIntel x86 utasításkészlet + disassembler működése
Intel x86 utasításkészlet + disassembler működése Kód visszafejtés. Izsó Tamás 2016. november 10. Izsó Tamás Intel x86 utasításkészlet + disassembler működése / 1 Section 1 Intel X86 utasításkészlet Izsó
RészletesebbenSegédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez
Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez Sándor Tamás, sandor.tamas@kvk.bmf.hu Takács Gergely, takacs.gergo@kvk.bmf.hu Lektorálta: dr. Schuster György PhD, hal@k2.jozsef.kando.hu
RészletesebbenMegszakítások és kivételek
Megszakítások és kivételek Megszakítások Megszakítás a számítási rendszernek küldött jelzés, mely valamilyen esemény felléptéről értesíti. Egy megszakítás felléptekor a rendszer: megszakítja az aktív program
RészletesebbenMáté: Számítógép architektúrák
NEXT ADDRESS JMPC JAMN JAMZ SLL8 SRA1 F0 F1 ENA EN INVA INC H OPC TOS LV SP PC MDR MAR WRITE READ FETCH 4 sín Mikroutasítások 24 bit: az adatút vezérléséhez bit: a következő utasítás címének megadásához,
RészletesebbenA PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere
2012. április 10. A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Miről lesz ma szó? alaki szabályok használata - mintapélda használata - mintapélda
RészletesebbenProgramozott soros szinkron adatátvitel
Programozott soros szinkron adatátvitel 1. Feladat Név:... Irjon programot, mely a P1.0 kimenet egy lefutó élének időpontjában a P1.1 kimeneten egy adatbitet ad ki. A bájt legalacsonyabb helyiértéke 1.
RészletesebbenA C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
RészletesebbenProgramozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás
Programozás BMEKOKAA146 Dr. Bécsi Tamás 2. előadás Szintaktikai alapok Alapvető típusok, ismétlés C# típus.net típus Méret (byte) Leírás byte System.Byte 1Előjel nélküli 8 bites egész szám (0..255) char
RészletesebbenA C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
Részletesebben