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

Hasonló dokumentumok
Paraméter átadás regisztereken keresztül

Stack Vezérlés szerkezet Adat 2.

1. Alapok. Programozás II

Programozás C++ -ban 2007/1

A 32 bites x86-os architektúra regiszterei

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

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.

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

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

Programozás C és C++ -ban

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Programozás C++ -ban

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Programozás II. 2. Dr. Iványi Péter

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás I gyakorlat

Bevezetés a programozásba I.

Assembly. Iványi Péter

Programozás II. 4. Dr. Iványi Péter

INFORMATIKA tétel 2019

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Pénzügyi algoritmusok

Programozás I gyakorlat

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

INFORMATIKA tétel 2018

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

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

Programozás C++ -ban 2007/7

Maximum kiválasztás tömbben

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

500. AA Megoldó Alfréd AA 500.

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

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Programozás I. gyakorlat

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

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Programozás C és C++ -ban

A legfontosabb DOS parancsok

IV. A SystemC alapelemei

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Bevezetés a programozásba I.

Tudnivalók az otthon kidolgozandó feladatokról

A C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.

2018, Funkcionális programozás

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Programozás 1. Dr. Iványi Péter

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

Pénzügyi algoritmusok

Programozás II gyakorlat. 8. Operátor túlterhelés

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

Programozás I. 5. Előadás: Függvények

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

Máté: Assembly programozás

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

7. gyakorlat. Fájlkezelés IO haladó Függvények haladó

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.

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

INFORMATIKA tétel 2017

Bevezetés a programozásba I.

Bevezetés a programozásba. 9. Előadás: Rekordok

Rekurzió. Dr. Iványi Péter

JCL eljárások Tanfolyami jegyzet. ICSS Kft 2012

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

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Magas szintű programozási nyelvek 1 beugró (levelező tagozat) május 19.

Informatika terméktervezőknek

Delphi programozás I.

Szövegek C++ -ban, a string osztály

code segment para public 'code' assume cs:code, ds:code, es:nothing, ss:nothing

500. CC Megoldó Alfréd CC 500.

Programozási alapismeretek 1. előadás

INFORMATIKA javítókulcs 2016

Programozás alapjai 9.Gy: Struktúra 2.

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?

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

117. AA Megoldó Alfréd AA 117.

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

BASH script programozás II. Vezérlési szerkezetek

Mintavételes szabályozás mikrovezérlő segítségével

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

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

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

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

Bevezetés a C++ programozásba

INFORMATIKAI ALAPISMERETEK

Flex tutorial. Dévai Gergely

Átírás:

Irvine eljárások Ahogy azt már év elején is említettük, a 32 bites környezet lehetővé tette számunkra, hogy több, már előre létrehozott eljárást használhassunk. Ehhez csupán telepítenünk kellett az Irvine függvénycsomagot (lásd a 3. gyakorlat anyaga), majd a programkódunk elején importálni a megfelelő könyvtárat. Ez jelen esetünkben az Irvine32.inc. Tehát az alábbi sort kell elhelyeznünk a program elején: INCLUDE Irvine32.inc Az adott függvény meghívásához a CALL parancsot kell használni. Röviden bemutatnánk néhány főbb eljárást és azok használatát, egy-egy példával, a teljesség igénye nélkül. ClrScr - Törli a képernyő tartalmát és a kurzort a képernyő bal felső sarkába helyezi (Clear Screen). call ClrScr CrLf - A következő sor elejére helyezi a kurzort (kocsi vissza + új sor, Carriage return + Linefeed). call CrLf ReadChar - Beolvas egy karaktert a standard bemenetről az AL regiszterbe. A karakter nem kerül kiírásra a képernyőre. char BYTE? call ReadChar mov char, al ReadInt - Beolvas egy 32 bites integer értéket a standard bemenetről az EAX regiszterbe. Az opcionális jel után csak számjegyek szerepelhetek. intval DWORD? 1

call ReadInt mov intval, eax ReadString - Beolvas egy karaktersorozatot a standard bemenetről, az Enter billentyű leütéséig. A beolvasott karakterek számát az EAX regiszterbe tárolja le, magát a sztringnek az eltolását (offset) pedig mindig az EDX regiszternek kell tartalmaznia. Az ECX regiszterben kell megadni a maximálisan beolvasható karakterek számát. buffer BYTE 50 DUP(?) bytecount DWORD? mov edx, OFFSET buffer ; a sztring pointere mov ecx, (SIZEOF buffer)-1 ; Max hossz call ReadString mov bytecount, eax ; beolvasás ; karakterek számának lementése WriteDec regiszterből. - Kiír egy 32 bites, előjelnélküli egész értéket az standard kimenetre az EAX mov eax, 2957FFFFh ; "295" fog megjelenni a képernyőn WriteInt regiszterből. - Kiír egy 32 bites, előjeles egész értéket a standard kimenetre az EAX mov eax, 216543 call WriteInt ; "+216543" fog megjelenni a képernyőn WriteString - Kiír egy sztringet a standard kimenetre. A sztring eltolás értékének az EDX regiszterben kell lennie. prompt BYTE "Add meg a neved: ", 0 mov edx, OFFSET prompt 2

call WriteString GoToXY - A kurzort a megadott oszlop és sor pozícióra mozgatja. Az oszlop szám (X koordináta) a DL regiszter tartalma, a sor szám (Y koordináta) pedig a DH regiszter tartalma lesz. mov dh, 10 mov dl, 20 ; 10. sor ; 20. oszlop call GoToXY ; A kurzos átmozgatása A további eljárásokról részletes leírás található az alábbi címen, az Irvine Library fül alatt: http://programming.msjc.edu/asm/help/index.html?page=source%2fabout.htm 3

Invoke direktíva Az INVOKE direktíva csak a 32 bites módban érhető el. Argumentumokat helyez el a veremben, majd meghív egy eljárást. Az INVOKE egy kényelmes helyettesítése a CALL utasításnak, mivel lehetőséget ad több argumentum elhelyezésére egyetlen programkód soron belül. Az alap szintaxis: INVOKE eljárásnév [, paraméterlista] A paraméterlista egy opcionális, vesszővel elválasztott listája az argumentumoknak, melyeket átadunk az eljárásnak. PROC direktíva: A PROC direktíva használatával hozhatunk létre saját eljárásokat. név PROC [attribútumok] [USES regiszterlista], paraméterlista... név ENDP A megadható attribútumokkal most nem foglalkozunk. USES direktíva: Az adott eljárás fejlécében a USES direktíva használatával lehetőségünk van megadni regiszterek egy listáját (vessző nélkül, egymás után felsorolva), melyek az eljárás meghívásakor lementésre kerülnek a verembe, végrehajtódik az eljárás, majd visszatéréskor a veremből visszaállításra kerülnek. Természetesen azon regiszter(ek) lementése nem szükséges, amely(ek) eredményt ad(nak) vissza. A paraméterlistában megadhatunk tetszőleges számú és típusú paramétert vesszővel elválasztva, melyeknek az eljárás hívásakor van lehetőségünk értéket adni és az eljárás futásakor felhasználni. Az alap szintaxis:..., elsőparamnev:típus1, másodikparamnev:típus2,... PROTO direktíva: A PROTO direktíva készíti el egy létező eljárás prototípusát. A prototípus deklarálja az eljárás nevét és paraméterlistáját. Lehetővé teszi, hogy az adott eljárást a definiálása előtt meghívjuk és leellenőrizzük a paramétereinek nevét és típusát, hogy megegyeznek-e az eljárás definíciójával. Meglévő eljáráshoz prototípust készíteni úgy lehet a legegyszerűbben, hogy lemásoljuk az eljárás fejlécét és a PROC kulcsszót lecseréljük a PROTO kulcsszóra, valamint ha használtuk a USES direktívát, akkor az csak az eljárás fejlécében szerepelhet, a prototípusban nem. 4

Egy egyszerű példa, melyben egy összeadó eljárást valósítottunk meg: INCLUDE Irvine32.inc A_val DWORD 10 B_val DWORD 5 main PROC ; NINCS SZUKSEG PROTO-ra HA AZ ELJARAS A HIVASA ELOTT VAN MEGVALOSITVA! Osszeg PROTO, param1:dword, param2:dword ; Az "Osszeg" nevu eljaras prototipusa MOV EAX, 123 ; beletesszuk a 123 erteket, hogy az eljarashivas utan ; leellenorizzuk, hogy valaban kimentettuk-e az erteket INVOKE Osszeg, A_val, B_val ; Az "Osszeg" nevu eljaras meghivasa. ; Ket parametere van: az osszeadando ket szam Call WriteInt ; ellenorzo kiiratas Call Crlf ; ujsor beszurasa INVOKE ExitProcess,0 main ENDP ; Egy osszeado eljaras, melynek ket bemeneti parametere van: az osszeadando ket szam ; Ezeket a parametereket jeloltuk param1 es param2 nevekkel, es tipusuk DWORD ; USES direktiva hasznalataval az EAX regisztert mentjuk ki hivas utan Osszeg PROC USES EAX, param1:dword, param2:dword MOV EAX, param1 ; az elso parameter regiszterbe helyezese ADD EAX, param2 ; a masodik parameter hozzaadasa Call WriteInt ; az eredmeny kiiratasa Call Crlf ; ujsor beszurasa ret ; visszateres az eljarashivashoz Osszeg ENDP end main Lehetőségünk van assembly nyelven írt kódot (eljárást) meghívni C/C++ kódon belül. Pl.: A C++ kód, melyben egy addem nevű eljárást hívunk, mely az assembly kódon belül van megvalósítva: // Addem Main Program (AddMain.cpp) #include <iostream> using namespace std; extern "C" int addem(int p1, int p2, int p3); int main(){ int total = addem( 10, 15, 25 ); cout << "Total = " << total << endl; return 0; } Az assembly kód, melyben egy összeadó eljárás van megvalósítva: 5

; The addem Subroutine (addem.asm) ; This subroutine links to Visual C++..386P.model flat public _addem _addem proc near push ebp mov ebp,esp mov eax,[ebp+16] ; first argument add eax,[ebp+12] ; second argument add eax,[ebp+8] pop ebp ret _addem endp end ; third argument Mikor a C++ kódból meghívjuk az eljárást, a bementi paraméterek bele kerülnek a verembe (plusz a visszatérési cím). Így az eljárás futásakor már benne vannak a veremben, csak megfelelő címzéssel el kell érni őket. A verem tartalma: 25 15 10 ret ebp ebp+16 ebp+12 ebp+8 ebp+4 További példák az INVOKE direktíva használatára. MessageBox megjelenítése: ;---ASM Hello World Win32 MessageBox.386.model flat, stdcall include C:\masm32\include\kernel32.inc include C:\masm32\include\user32.inc Titlestr db 'Win32', 0 Msg db 'Hello World', 0 Main: INVOKE MessageBoxA, 0, offset titlestr, offset msg, 0 INVOKE ExitProcess, eax End Main Egy kis érdekesség: A következő program (ShowTime.asm) lekérdezi az aktuális időpontot, majd megjeleníti azt az általunk választott képernyő pozíción. 6

INCLUDE Irvine32.inc systime SYSTEMTIME <> XYPos COORD <10,5> consolehandle DWORD? colonstr BYTE ":",0 main PROC ; Get the standard output handle for the Win32 Console. INVOKE GetStdHandle, STD_OUTPUT_HANDLE mov consolehandle,eax ; Set the cursor position and get the system time. INVOKE SetConsoleCursorPosition, consolehandle, XYPos INVOKE GetLocalTime, ADDR systime ; Display the system time (hh:mm:ss). movzx eax,systime.whour ; hours mov edx,offset colonstr ; ":" call WriteString movzx eax,systime.wminute ; minutes call WriteString movzx eax,systime.wsecond ; seconds call Crlf exit main ENDP END main Feladatok 1. Írj egy eljárást, melynek legyen két DWORD típusú bemeneti paramétere. Az eljáráson belül pedig kerüljön kiszámításra a két paraméter minimuma (maximuma). Az eljárást az INVOKE direktíva segítségével hívd meg. Használd a USES direktívát az eljáráson belül felhasznált regiszterek kimentésére. 2. Írj egy eljárást, melynek legyen két bemeneti paramétere. Az egyik típusa DWORD legyen, mely egy karaktersorozat eltolása, a másik típusa BYTE legyen, amely pedig a karaktersorozatban keresendő karakter legyen. Az eljárás tehát a paraméterben kapott karaktersorozatban számolja meg hányszor szerepel az úgyszintén paraméterként kapott karakter. Az eljárást az INVOKE direktíva segítségével hívd meg. 7