Paraméter átadás regisztereken keresztül

Hasonló dokumentumok
A 32 bites x86-os architektúra regiszterei

Adatelérés és memóriakezelés

Irvine eljárások. ClrScr - Törli a képernyő tartalmát és a kurzort a képernyő bal felső sarkába helyezi (Clear Screen).

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.

Stack Vezérlés szerkezet Adat 2.

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

Assembly. Iványi Péter

Digitális rendszerek. Utasításarchitektúra szintje

Introduction to 8086 Assembly

PE/COFF fájl formátum

Intel x86 utasításkészlet + disassembler működése

Aritmetikai utasítások

Számítógép Architektúrák

A programozás alapjai 1 Rekurzió

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

8. gyakorlat Pointerek, dinamikus memóriakezelés

Assembly utasítások listája

Máté: Számítógép architektúrák

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

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Karunkról Kari digitális könyvtár

Máté: Assembly programozás

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék

Assembly Utasítások, programok. Iványi Péter

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

n-pr H 5 C 6 CHCl 2 Pascal és assembler

Assembly Címzési módok. Iványi Péter

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.

Programozási Nyelvek: C++

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Aritmetikai utasítások I.

Programozás alapjai. 10. előadás

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Programozási nyelvek 6. előadás

Verem Verem mutató 01

Rekurzió. Dr. Iványi Péter

Számítógépek felépítése

Assembly programozás levelező tagozat

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Kommunikáció. 3. előadás

Assembly programozás levelező tagozat

SZÁMRENDSZEREK KÉSZÍTETTE: JURÁNYINÉ BESENYEI GABRIELLA

Máté: Assembly programozás

Intel x86 utasításkészlet

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

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

Alprogramok fordítása. Kódgenerálás II. (alprogramok, memóriakezelés) Függvény, eljárás. Alprogramok írása assemblyben

Processzorok Utasításszintű Kezelése tavasz

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

[cimke:] [feltétel] utasítás paraméterek [; megjegyzés]

assume CS:Code, DS:Data, SS:Stack Start mov dl, 100 mov dh, 100 push dx Rajz

Máté: Számítógép architektúrák

Az interrupt Benesóczky Zoltán 2004

Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

Felvételi tematika INFORMATIKA

assume 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

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Bevezetés az informatikába

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

Assembly. Iványi Péter

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Máté: Számítógép architektúrák

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

A hibát az alábbi Python program segítségével tudjuk előidézni:

OOP #14 (referencia-elv)

Biztonságos programozás Puffer túlcsordulásos támadások

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

egy szisztolikus példa

Szemantikai elemzés. konzisztenciájának vizsgálata a szemantikai elemzés feladata lesz.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Bevezetés a számítástechnikába

Kitlei Róbert kitlei.web.elte.hu. Karunkról Kari digitális könyvtár

Szegmentálás. Memória kezelési stratégia mely a felhasználó nézőpontját támogatja Például:

Fibonacci számok. Dinamikus programozással

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Máté: Számítógép architektúrák

Programozás alapjai II. (3. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

Összeállította: dr. Leitold Adrien egyetemi docens

Az 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:

Hírközlő rendszerek biztonsága laboratórium Számítógépes rendszerek sebezhetőségének vizsgálata

3. Osztályok II. Programozás II

Programozási módszertan. Dinamikus programozás: szerelőszalag ütemezése Mátrixok véges sorozatainak szorzása

Biztonságos programozás Puffer túlcsordulásos támadások

Vezérlésfolyam gráf és X86 utasításkészlet

Programozás alapjai. 7. előadás

7. fejezet: Mutatók és tömbök

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

Számítógép architektúrák

A sorozat fogalma. függvényeket sorozatoknak nevezzük. Amennyiben az értékkészlet. az értékkészlet a komplex számok halmaza, akkor komplex

Átírás:

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: ELJARAS ELJARAS PROC... ENDP Paraméter átadás regisztereken keresztül A paraméter átadás egyik legegyszerűbb módja az adatok regisztereken keresztül történő átadása. Ilyenkor kihasználjuk, hogy az általános célú regiszterek tartalma nem változik az eljárások hívásakor, így az eljárás meghívása előtt a regszterekbe tett adatok az eljáráson belül gond nélkül felhasználhatóak. Az alábbi példa az előadáson is elhangzott skaláris szorzat megoldását mutatja be. Az adatszegmensben definiálásra kerül két vektor, amelyeknek a skaláris szorzatát szeretnénk kiszámítani. Az eljáráshívás előtt ezen vektorok eltolásértékeit beletesszük két tegiszterbe, majd az eljáráson belül ezeket az eltolásokat használjuk az adatok elérésére..data ; elemszám fordítási id}oben ElemSzam EQU SIZEOF Vekt1 / TYPE Vekt1 Vekt1 DW 1, 2, 3, 4, 5 ; tömb értékek Vekt2 DW 24, 23, 22, 21, 20 ; Vekt3 DW 90, 91, 92, 93, 94 ; Eredm DD? ; helyfoglalás eredménynek 1

.code Main PROC ECX,Elemszam ESI,OFFSET Vekt1 EDI,OFFSET Vekt3 CALL Skal ; Eljárás meghívása, eredmény ; az EAX regiszterben jön létre Eredm,EAX ; Mentsük memóriába CALL WriteDec ; És írjuk ki konzolra, ; 1390 lesz az értéke CALL CrLf ; Új sor, kocsi vissza konzolra exit Main ENDP Skal PROC NEAR PUSH EBX PUSH ECX PUSH EDX ; Végrehajtó rész kezdete PUSH 0 ; Összeg verembe, elfogytak ; a regiszterek! JCXZ kesz ; Ugrás a kesz címkére, ; ha ECX (= ElemSzam) = 0 ism: EBX,ECX ; Vektor index számítása DEC EBX ;... SHL EBX,1 ; Index = ( ECX - 1 ) * 2 ZX EAX,WORD PTR [EBX+ESI]; Következ}o vektor ; elem, WORD PTR kell! IMUL WORD PTR [EBX+EDI] ; Szorzása másik ; vektor elemével, WORD PTR kell! SHL EDX,16 ; Szorzási átvitel EDX magas ; helyiérték}u szavára POP EBX ; Részösszeg el}ovétele ADD EBX,EAX ; Alacsony helyiérték hozzáadása ADC EBX,EDX ; Magas helyiértékek összeadása PUSH EBX ; Részösszeg mentése újra LOOP ism ; Ciklus kesz:

POP EAX ; Eredmény EAX-be kivétele ; Végrehajtó rész vége POP EDX POP ECX POP EBX RET Skal ENDP Paraméter átadás adat szegmensen keresztül A paraméterek regisztereken keresztül történő átadásával csak annyi probléma van, hogy a regsizterek száma véges. az átadásra ilyenkor használhatjuk az EAX, EBX, ECX, EDX általános regisztereket, az ESI-t, EDI-t, és végszükség esetén akár az EBP-t, de ha hétnél több paramétert kell átadnunk, akkor más megoldást kell találnunk. Erre adhat egy lehetséges megoldást, ha a paramétereket az eljáráshívás előtt az adat szegmensben helyezzük el, és az eljárás belsejében onnan vesszük ki azokat. A Skaláris sorzat példa ezen módosulatát mutatja be az alábbi kód.

.data ; elemszám fordítási id}oben ElemSzam EQU SIZEOF Vekt1 / TYPE Vekt1 Vekt1 DW 1, 2, 3, 4, 5 ; tömb értékek Vekt2 DW 24, 23, 22, 21, 20 ; Vekt3 DW 90, 91, 92, 93, 94 ; Eredm DD? ; helyfoglalás eredménynek ; eljárás paraméterek param1 DWORD? param2 DWORD? param3 DWORD?.code Main PROC ECX,Elemszam ESI,OFFSET Vekt1 EDI,OFFSET Vekt3 param1, ESI param2, EDI param3, ECX CALL Skal ; Eljárás meghívása, eredmény ; az EAX regiszterben jön létre Eredm,EAX ; Mentsük memóriába CALL WriteDec ; És írjuk ki konzolra, ; 1390 lesz az értéke CALL CrLf ; Új sor, kocsi vissza konzolra exit Main ENDP Skal PROC NEAR PUSH EBX PUSH ECX PUSH EDX ESI, param1 EDI, param2 ECX, param3

; Végrehajtó rész kezdete PUSH 0 ; Összeg verembe, elfogytak ; a regiszterek! JCXZ kesz ; Ugrás a kesz címkére, ; ha ECX (= ElemSzam) = 0 ism: EBX,ECX ; Vektor index számítása DEC EBX ;... SHL EBX,1 ; Index = ( ECX - 1 ) * 2 ZX EAX,WORD PTR [EBX+ESI]; Következ}o vektor ; elem, WORD PTR kell! IMUL WORD PTR [EBX+EDI] ; Szorzása másik ; vektor elemével, WORD PTR kell! SHL EDX,16 ; Szorzási átvitel EDX magas ; helyiérték}u szavára POP EBX ; Részösszeg el}ovétele ADD EBX,EAX ; Alacsony helyiérték hozzáadása ADC EBX,EDX ; Magas helyiértékek összeadása PUSH EBX ; Részösszeg mentése újra LOOP ism ; Ciklus kesz: POP EAX ; Eredmény EAX-be kivétele ; Végrehajtó rész vége POP EDX POP ECX POP EBX RET Skal ENDP A fenti módon definiált eljárás már tetszőleges számú vektor eltolását képes megkapni, és tetszőleges vektorokon képes műveleteket végezni. Ha a paraméter átadás az adatszegmensben történik, akkor érdemes az eljáráshívás előtt a használandó regiszterek értékét a verembe menteni, majd onnan visszamenteni az eljáráshívás után.

Paraméter átadás vermen keresztül A paraméter átadás legfejlettebb módja a paraméterek vermen keresztül történő átadása. Ilyenkor az eljáráshívás előtt a verembe kell menteni ezeket az értékeket. Ebben az helyzetben az adatok átadása az alábbi lépésekkel oldható meg. A paramétereket elhelyezzük a veremben, és a sorrendjüket feljegyezzük. Meghívjuk az eljárás. AZ eljárás hívás elején az EBP korábbi értékét elmentjük, és készítünk bele egy másolatot az ESP-ről. Ekkor az EBP egy fix pontként fogja mutatni, hogy az eljárás indulásakor hol volt a verem teteje. Az eljárás törzsén belül elvégezzük a számítást. A paramétereket az EBP-hez képest relatív címzéssel tudjuk megtalálni. A vermet továbbra is használhatjuk rendeltetés szerűen (akár újabb eljárásáok számára a paraméterek átadására is), mivel az ESP szabad, a paraméterek elérésére az EBP-t használjuk. Az eljárás végén visszaállítjuk az EBP korábbi értékét. Ha a hívó kód hasonlóan a vermen keresztül kapta a paramétereit, akkor ezzel visszaállítjuk a paraméterlistáját. Visszatérünk. A bent maradt paramétereket kitakarítjuk a veremből. A skaláris szorzat vermet alkalmazó megoldása az elábbi kódban található..data ; elemszám fordítási id}oben ElemSzam EQU SIZEOF Vekt1 / TYPE Vekt1 Vekt1 DW 1, 2, 3, 4, 5 ; tömb értékek Vekt2 DW 24, 23, 22, 21, 20 ; Vekt3 DW 90, 91, 92, 93, 94 ; Eredm DD? ; helyfoglalás eredménynek.code Main PROC EAX,Elemszam ; Paraméterek verembe helyezése

PUSH EAX EAX,OFFSET Vekt1 PUSH EAX EAX,OFFSET Vekt3 PUSH EAX ; Verembe került eddig: ; N értéke, Vekt1 címe, Vekt3 címe ; ( 3 * 4 = 12 bájt ) ; CALL hatására a verembe kerül még ; a visszatérési cím is (4 bájt)! CALL Skal ; Eljárás meghívása, ; eredmény az EAX regiszterben jön ADD ESP,12 ; Verem takarítás: 3 * 4 bájt ; (A RET már kivette a címet!) Eredm,EAX ; Eredményt mentsük memóriába CALL WriteDec ; És írjuk ki konzolra CALL CrLf ; Új sor, kocsi vissza konzolra exit Main ENDP Skal PROC NEAR PUSH EBP ; EBP mentése EBP,ESP ; Veremmutató bázis regiszterbe töltése ; verem címzéshez PUSH ESI ; Regiszterek mentése PUSH EDI ; ESP változik, de EBP a belépéskori offszet ; marad! PUSH EBX PUSH ECX PUSH EDX ; A verem tartalma jelenleg ; (alulról felfelé): ; Paraméterek: ; N értéke, Vekt1 címe, Vekt3 címe, ; Visszatérési cím (NEAR címke), ; Mentett regiszterek: ; EBP, ESI, EDI, EBX, ECX, EDX EDI,[EBP+8] ; Paraméterek átvétele a veremb}ol ESI,[EBP+12]

ECX,[EBP+16] ; Végrehajtó rész kezdete... ; Nincs változás, ugyanaz mint el}oz}oleg ; Végrehajtó rész vége POP EDX POP ECX POP EBX POP EDI POP ESI POP EBP RET Skal ENDP A vermen keresztüli paraméterátadásnak akkor van igazán előnye a regiszterekben illetve az adatterületen átadott paraméterekkel szemben, ha sok paramétert kell átadni, valamint rekurzív eljárások paramétereinek átadásánál. Feladatok 1. Írjunk egy eljárást, amely kiszámolja egy sorozat átlagát! Az eljárásnak 2 paramétere legyen (melyeket a veremben kap): az első a sorozat offszetje, a második a sorozat hossza. Kiindulás forrásként használhatod a Tombok.asm állományt. 2. Írj rekurzív kódot a Fibonacci számsorozat értékeinek kiszámtítására!