Gábor LÉKÓ, PhD student
Assembly programozás gyakorlat 2016-2017/2
• Bevezetés, áttekintés o Assembly alapfogalmak. Assembly nyelv előnyei, hátrányai, alkalmazási lehetőségei. • x86 memóriamodell, címzési módok o Az x86 memória modellje és regiszterkészlete. o Adat- és kódterület címzése. • x86 utasításrendszer o Aritmetikai, adatmozgató, logikai utasítások. o Vezérlésátadás, eljáráshívás, ciklusszervezés. o Sztring műveletek, REP prefixumok. • Macro Assembler o Macro Assembler elemei, direktívái, makrók, blokkismétlés, struktúrák, rekordok. • Assembly programozási technikák o Paraméterátadási lehetőségek eljáráshíváskor: regiszterekben, vermen keresztül. o Rekurzív és re-entráns eljárások, eljárásra lokális adatterület. o Rendszerhívások. Ajánlott irodalom: • Előadások és gyakorlatok anyaga. • A. S. Tanenbaum: Számítógép-architektúrák, 2. átdolgozott, bővített kiadás (Panem, 2006) • Kip R. Irvine: Assembly Languagefor x86 Processors, 7th edition (Pearson, 2015) • B. B. Brey: Programmingthe 80286, 80386, 80468, and Pentium-basebPersonal Computer (Prentice Hall, 1996) • Máté Eörs: Assembly programozás (NOVADAT, 1999, 2000). • Pethő Ádám: IBM PC/XT felhasználóknak és programozóknak, 1. kötet: Assembly alapismeretek (SZÁMALK, 1992).
A gyakorlatok látogatása kötelező. Hiányzás miatti gyakorlatok pótlására nincs lehetőség. A gyakorlaton a félév során 50 pontot lehet elérni: • 4 kis ZH mindegyikén 5-5 pontot, összesen 20 pontot, • 1 nagy ZH-n 20 pontot, • Otthon kidolgozott feladat beadásával és védésével 10 pontot. Az elérhető 50 pontból legalább 25 pontot kell elérni a gyakorlat sikeres teljesítéséhez. A kis zárthelyi dolgozatok nem pótolhatók még hivatalos igazolás birtokában sem, valamint javításukra sincs lehetőség! Kis ZH-k időpontjai 2017-ben: 5., 7., 9. és 11. megtartott gyakorlaton (Azaz 5. gyakorlattól kezdve minden második gyakorlaton). Állami ünnep(ek) és dékáni szünet(ek) következtében elmaradó gyakorlatok miatt, nem ugyanazon a héten fogja a kis ZH-kat megírni minden gyakorlati csoport. Kérjük a hallgatókat, kísérjék figyelemmel a megtartott gyakorlatok számát az 5. héttől kezdve, és onnan számolva minden második gyakorlaton megíratásra kerül egy-egy kis ZH. Nagy ZH időpontja: 14. szorgalmi héten, május 8-12 (a gyakorlat időpontjában). További pontszerzési lehetőséget biztosít az otthon elkészítendő beadható feladat. A beadható feladatokat május 8, 23:55-ig a CooSpace-en kell beadni, és az utolsó gyakorlaton meg kell védeni. A feladat megoldásához tetszőleges segítséget igénybe lehet venni, de a védés alkalmával tisztában kell lenni a teljes program működésével! A beadható feladattal 10 pont szerezhető. A beadható feladatokra a CooSpace-en lehet majd jelentkezni. A feladatok listája később kerül kihirdetésre. A beadható feladatokra március 20-tól április 30-ig lehet jelentkezni a CooSpace-en. A beadható feladatokat az utolsó gyakorlat alkalmával (május 15-19.) meg kell védeni. A félév végi gyakorlati jegy a félév során szerzett pontszámok összege alapján kerül megállapításra. Ha az elért pontszámok összege < 25, akkor 1 (elégtelen). Ha az elért pontszámok összege < 31, de >=25, akkor 2 (elégséges). Ha az elért pontszámok összege < 38, de >=31, akkor 3 (közepes). Ha az elért pontszámok összege < 44, de >=38, akkor 4 (jó). Ha az elért pontszámok összege >= 44, akkor 5 (jeles). Sikertelen gyakorlati teljesítés (elégtelen gyakorlati jegy) javítása javító ZH megírásával lehetséges. Javító ZH megírására az a hallgató jogosult, aki a szorgalmi időszakbeli részteljesítései alapján elégtelen gyakorlati jegyet szerzett, és legalább az egyik kis vagy nagy zárthelyi dolgozatot megírta. A javító ZH feladatai a teljes félév gyakorlati anyagát lefedik. A javító ZH-n 20 pont szerezhető. A javítás akkor sikeres, ha a hallgató a javító ZH-n legalább 10 pontot szerez. Sikeres javítás esetén elégséges (2) gyakorlati jegy kerül megállapításra. Ennél jobb jegy még magasabb összpontszám esetén sem adható. A javításnál a beadandó feladat pontszáma nem vehető figyelembe. A javító ZH írására várhatóan az első vizsgahéten kerül sor, a pontos időpont később kerül meghirdetésre.
1. hét - 02.06.-02.10. - Követelmények
2. hét - 02.13.-02.17. - Számrendszerek
3. hét - 02.20.-02.24. - Assembly keretprogram, és programok fordítása Visual Studio-val
4. hét - 02.27.-03.03. - Címzési módok és adatkezelés
5. hét - 03.06.-03.10. - 1. kisZH - Adatmozgató és aritmetikai utasítások I.
Bartek András leírása a grafikus programozásoz (csak 16 bites üzemmódban)
6. hét - 03.13.-03.17. - ELMARAD - Március 15. - Állami ünnep
7. hét - 03.20.-03.24. - Adatmozgató és aritmetikai utasítások II.
8. hét - 03.27.-03.31. - 2. kisZH - Vezérlésátadás
9. hét - 04.03.-04.07. - Tömbök és sztringek kezelése
10. hét - 04.10.-04.14. - 3. kisZH - Paraméter átadások eljárások számára I.
11. hét - 04.17.-04.21. - TAVASZI SZÜNET
12. hét - 04.24.-04.28. - Paraméter átadások eljárások számára II. - Invoke és Irvine eljárások
13. hét - 05.01.-05.05. - 4. kisZH - Számok kiíratása és sztring műveletek - Beadandó feladat beadási határideje 2017. május 8. (hétfő)
14. hét - 05.08.-05.12. - NagyZH
15. hét - 05.15.-05.19. - ELMARAD - Kötelező program bemutatása 05.18.-án és 05.19.-én, mindkét nap 10:00 - 11:00 és 13:00 - 18:00, az irodámban (ha épp nem vagyok benn, ne menjetek sehova, max pár percre tűntem el). Védeni mindenkinek kötelező, aki még előtte nem tette meg és szeretne pontot kapni a programjára.
1. gyakorlat
Követelmények ismertetése
A gyakorlati követelmények megtekinthetőek lesznek a félév folyamán itt a honlapomon (Követelmények fül), CooSpace-en és ETR-ben is.
Egyéb hasznos információk
A gyakorlat anyaga elérhető lesz a honlapomon.
Kurzusfórumnak a CooSpace-t fogjuk használni. A kisZH-k és nagyZH pontszámai ETR infosheet-re fognak felkerülni, de CooSpace-en is jelezni fogom, ha felkerülnek az újabb eredmények, hogy ne kelljen az infosheet-et figyelgetni.
Ha valakinek kérdése van az anyaggal kapcsolatban óra előtt/közben/után nyugodtan lehet kérdezni, bármikor félbe lehet szakítani (nem szó szerint) és megbeszéljük, ha van kérdés, illetve email-ben állok rendelkezésetekre ( leko@inf.u-szeged.hu ). Igyekszem minden email-re még az érkezése napján reagálni, legkésőbb az esti órákban. Ha nem válaszolok egy napon belül, nyugodtan írjatok rám mégegyszer. A küldött email tárgya az alábbi formájú legyen: [assembly] ( Ez nagyon fontos az email-ek kategorizálásakor, kérem mindenki tartsa be! ).
Ha valaki szeretne jönni fogadóórára, várom sok szeretettel, csak írjon legkésőbb előző nap (ha lehet előbb), hogy szeretne jönni. Majd egyeztetünk időpontot.
Terv szerint a gyakorlati anyag még az adott gyakorlatot megelőző héten elérhető lesz, ehhez igyekszünk tartani magunkat. Várhatóan ajánlott lesz a jegyzetelés a gyakorlaton, mivel lehetséges, hogy több minden fog felkerülni a táblára, mint ami a kiadott jegyzetben megtalálható lesz. Vissza kérve csak az lesz ami a jegyzetbe is bele kerül, viszont az órai jegyzetelés segíthet a megértésben és a későbbi tanulásban. ( Röviden: szokás szerint. )
Microsoft temékekhez licence igénylése:
Visual Studio 2015 Enterprise licence igényléséhez írni kell egy email-t az alábbi címre: msinf@inf.u-szeged.hu . Az email tárgya Regisztráció legyen, és adjuk meg az alábbi adatokat: Név, EHA, h-s azonosító. Fontos, hogy csak STUD-os email címről lehet igényelni! Majd a visszaigazolás után az alábbi weboldalon való bejelentkezés után elérhetőek a Microsoft termékek: Microsoft DreamSpark WebStore .
Az ingyenes verzió pedig az alábbi weboldalról tölthető le: Visual Studio Express for Windows Desktop .
Első lépések
Tavaly (2016) a 16 bites rendszerről áttérünk a 32 bitesre. A programok fejlesztése Visual Studio 2015 környezetben fog történni. Ez nagyban megkönnyíti majd a fejlesztést és a VS Debug módjának köszönhetően a hibakeresést, illetve a programok elemzését. Számítógépes ZH-k is lesznek, ahol a Visual Studio-t fogjuk használni, ezért jelentősen ajánlott az előző pontban leírt két beszerzési mód egyike segítségével beszerezni, majd telepíteni az otthoni gépre is ezt a fejlesztőkörnyezetet.
Kezdő lépésként az alábbi dokumentáció segítségével állíthatjuk be otthon a fejlesztéshez szükséges környezetet: VS2015_es_MASM_beallitas_otthon.pdf .
MASM32 SDK letöltési lehetőség itt (Visual Studio használata esetén nincs rá szükség).
Motiváció
Röviden: Az Assembly nyelv segítségével többet megtudhatunk a számítógép belső működéséről, hogy hogyan működnek a CPU/CPU regiszterek a memória címzésekkel, alapszintű utasításokat felhasználva, hogy milyen adattípust mikor használjunk, hogyan írjunk kisebb, gyorsabb és hatékonyabb routine-okat.
Bővebben: Az Assembly nyelv egy szimbolikus reprezentációja a gépi kódnak, ami lehetőséget nyújt a programozók számára, hogy gépi kódot írjanak anélkül, hogy hosszú bináris karaktersorozatokkal kellene bajlódniuk. Az Assembler fordítja az Assembly kódot gépi kódra. Az Assembly nyelvnek a végrehajtási hatékonysága megegyezik a gépi szintű nyelvekével. Majd látni fogjuk, hogy egy Assembly nyelven írt kódot akár együttesen is alkalmazhatunk C++ kóddal.
Azt gondolhatnánk, hogy az Assembly egy halott nyelv. Bár valószínűleg valóban nem fog egyikünk se a következő szembe jövő felhasználónak Assembly nyelven új alkalmazást írni, mégis van némi előnye az Assembly nyelv tanulásának. Manapság az Assembly nyelvet első sorban közvetlen hardver manipulációra használják. Speciális processzor utasításokhoz való hozzáférés miatt, vagy kritikus teljesítmény problémák kezelésére. Tipikus felhasználása driver-ek, alacsony szintű beágyazott rendszerek és valós idejű rendszerek programozásában található meg. Az Assembly hasznos lehet sebesség optimalizálásra is. Teljes irányítási lehetőséget nyújt a rendszer forrásokhoz. De pl. PoC exploit (Proof Of Concept exploit - támadás egy számítógép vagy hálózat ellen. Nem okoz sérülést, de megmutatja, hogy egy hacker hogyan tudja kihasználni egy gép sebezhetőségét szoftver vagy hardver szinten) írásakor is hasznos lehet az assembly tudás.
2. gyakorlat
Számrendszerek (Varga László)
Az eheti gyakorlati anyag végén lévő feladatok megoldása elérhető itt .
Egy összefoglaló táblázat a tanulmányozott számrendszerekhez:

1. ZH-ban legtöbbször előforduló hibák alapján (elmúlt éves tapasztalatok): - Olvassuk el JÓL, hogy milyen számrendszerben vannak megadva a számok a feladatban. - Tizesből kettes számrendszerbe való átváltáskor az oszlopos elrendezés után alulról-felfelé történik a bináris szám leolvasása. - Kettes számrendszerben, két bináris szám összeadásakor 1+1 esetén az eredmény 0, és 1 'megy tovább'. - Tizenhatos számrendszerben, két hexa szám összeadásakor, ha az eredmény nagyobb, mint 15 (F), akkor ["eredmény" - 16] lesz a valós eredmény és 1 'megy tovább'. - Pozitív szám kettes komplemense önmaga. - Kettes komplemens számolásakor, ha egy decimális szám binárissá konvertálásakor nem igényel 8 bitet az ábrázolása, akkor is 8 biten kell ábrázolni, a felső helyértékek 0-ákkal való feltöltésével. Pl.: 123 = 111 1011 -> 0111 1011.
Plusz egy megjegyzés: mindegy milyen módszerrel számoltok, de legyen levezetés is hozzá a ZH-ban. Pl. ha a 71d 10esből 2es számrendszerbe való átalakítása a feladat, a 71d = 1000111b leírása nem elegendő a maximális pontszámhoz.
3. gyakorlat
Telepítés, és Visual studio használat: VS2015_es_MASM_beallitas_otthon.pdf
Programok debug-olása - Előadás anyagból
Assembly keretprogram magyarázattal
Bevezetés a Kip Irvine csomag használatához - HelloAsm.asm programmal kapcsolatos gyakorló feladatok
"Hello World" program: HelloAsm.asm ( Kommentezett verzió )
Kiegészítő leírás a beépített Irvine eljárásokhoz (Az Irvine Library-t válasszuk a bal oldali listából)
Szintaxis kiemelő Visual Studio-hoz (syntax highlighting):
#1: MASM syntax highlighting - Kip Irvine weboldala alapján (kiszínezi a regisztereket és típusokat is, viszont a kommenteket nem)
#2: AsmHighlighter - Visual Studio weboldala (telepítős, regisztereket és típusokat nem színezi ki, viszont megkülönbözteti a kommenteket - screenshot)
Figyelem felhívás: ahhoz, hogy módosítani tudjuk a Project32-höz hozzáadott fájlokat újabb fordításhoz és futtatáshoz, előbb ki kell kapcsolni a projekt beállításokon belül a lista fájl készítését ( Debug/Project Properties/Microsoft Macro Assembler/Listing File/Generate Preprocessed Source Listing No-ra állítása).
4. gyakorlat
Memória címzési módok (Varga László)
Minta kód a gyakorláshoz: MemAddress.asm (A kódhoz tartozó listafájl: Project.lst - ellenőrzéshez )
Jövő héten 1. kisZH!
Kiegészítés az órai anyaggal kapcsolatban:
Hogyan képzeljük el a memória felépítését:
MEMÓRIA ~~~~~~~~~ <-- kistenger azt jelenti, hogy a memóriának csak egy részét ragadtuk ki | | BÁZISCÍM -->_ |_______| _ OFFSET | | | | |_ |adat | | | | | SZEGMENS - összefüggő memóriaterület |_______| _| | | | | | | |_______| | | ~~~~~~~~~ <-- és itt is
Megcímezhető memória méretek:
BYTE vagy röviden DB <- 1 bájt = 8 bit WORD vagy röviden DW <- 2 bájt = 16 bit DWORD vagy röviden DD <- 4 bájt = 32 bit
Kiegészítés a regiszter indirekt címzéshez:
.data val DWORD 15h szoveg BYTE "Bela", 0 .code MOV EAX, 6 ; #1. Regiszterbe számérték MOV EAX, val ; #2. Regiszterbe változó, HA! megegyezik a nagyságuk MOV ESI, offset val ; #3. offset használata: az ESI fog ezutan a "val"-ra mutatni MOV EAX, [ESI] ; #4. Regiszter indirekt címzés. Belekerul az EAX-be az ESI altal mutatott "val" tartalma (15h) ; a val és az EAX mérete meg kell, hogy egyezzen! ; ebben az esetben eltérő méret esetén sem dobna hibát a fordító, viszont helytelen eredményt kapnánk! MOV ESI, offset szoveg MOV AL, [ESI] MOV EBX, 1 MOV AL, [ESI+EBX]
5. gyakorlat
1. kisZH
Kódkezdemény gyakorláshoz: Szamok32.asm
Kiegészítés az órai anyaggal kapcsolatban:
Regiszter tartalmának nullázása kicsit másképpen (persze a "MOV REG, 0" is tökéletes), pl.:
XOR EAX, EAX ; EAX = 0000 0000 XOR BX, BX ; BX = 0000 ... A B | XOR ----------- 0 0 | 0 0 1 | 1 1 0 | 1 1 1 | 0 Mivel bitenként hasonlítja össze az adott regisztert önmagával, így minden összehasonlított bit egyforma lesz. Mivel az igazságtábla azt mutatja, hogy akár 0, akár 1 értékekről legyen szó 0 lesz az eredmény, ezért kinullázódik a regiszter tartalma.
6. gyakorlat
ELMARAD - Március 15.
7. gyakorlat
5. gyakorlaton vett anyag folytatása ( Adatmozgató- és Aritmetikai utasítások )
Jövő héten 2. kisZH!
Összefoglaló:
- Az Adatmozgató- és Aritmetikai utasítások doksiból 1-2 parancs - 2 pont
( Mit csinál az adott parancs, mik és mekkorák lehetnek a paraméterei. Mint pl. az 1. mintaZH 2. feladata )
Egy lehetséges megoldás: A MOV utasítás egy adatmozgatást végző utasítás. Két parmétere van. A 2. paraméterből helyezi át az adatot az 1. paraméterbe. A két paraméter méretének meg kell egyeznie. Ennek a 3 információnak szereplenie kell minden utasítás esetén a max pontért! MUL, IMUL, DIV és IDIV esetén tudni kell az összes paraméterezési lehetőséget!
- A gyakorlaton nézett feladatokhoz hasonló, rövid aritmetikai utasítás kombináció végrehajtása - 3 pont
( Adott egy adatszegmens - mint pl. az 1. mintaZH 3. feladatában -, programozzuk le pl. az (ADAT1+ADAT2)/TOMB1[2] műveletsort )
PL.: ADAT1 db 71 ADAT2 dw -12 TOMB1 dw 10, 11, 12, 13, 14 Egy lehetséges megoldás ( (ADAT1+ADAT2)/TOMB1[2] ): MOV AL, ADAT1 ; AL = ADAT1 CBW ; AX = ADAT1 MOV BX, ADAT2 ; BX = ADAT2 ADD AX, BX ; AX = ADAT1+ADAT2 MOV BX, [TOMB1+4] ; BX = TOMB1[2] MOV DX, 0 ; mivel 16 bites osztás lesz, ki kell nullázni a DX-et (DX:AX/op) IDIV BX ; AX = DX:AX / BX ; DX = DX:AX % BX
Kiegészítés az órai anyaggal kapcsolatban:
ZH-ban legtöbbször előforduló hibák alapján (elmúlt éves tapasztalatok): DB - BYTE (8 BIT) DW - WORD (16 BIT) DD - DWORD (32 BIT) NEM TESZÜNK 8 BITES REGISZTERBE 16 BITES ADATTAGOT ÉS FORDÍTVA NEM TESZÜNK 8 BITES REGISZTERBE 32 BITES ADATTAGOT ÉS FORDÍTVA NEM TESZÜNK 16 BITES REGISZTERBE 32 BITES ADATTAGOT ÉS FORDÍTVA NEM VÉGZÜNK MŰVELETEKET KÜLÖNBÖZŐ NAGYSÁGÚ REGISZTEREK KÖZÖTT NAGY ÁTLAGBAN, KIVÉTEL PL AZ OSZTÁS A CBW-NEK, CWD-NEK, CWDE-NEK NINCS OPERANDUSA AZ ELŐJELNÉLKÜLI SZORZÁSNAK ÉS AZ OSZTÁSNAK CSAK EGY OPERANDUSA VAN CBW AL -> AX CSAK ÉS KIZÁRÓLAG CWD AX -> DX:AX CSAK ÉS KIZÁRÓLAG CWDE AX -> EAX CSAK ÉS KIZÁRÓLAG MUL HA OP == 8 BIT, AL*OP -> AX HA OP == 16 BIT, AX*OP -> DX:AX HA OP == 32 BIT, EAX*OP -> EDX:EAX DIV HA OP == 8 BIT, AX/OP -> AL AX%OP -> AH HA OP == 16 BIT, DX:AX/OP -> AX DX:AX%OP -> DX HA OP == 32 BIT, EDX:EAX/OP -> EAX EDX:EAX%OP -> EDX DX-ET LE KELL NULLÁZNI 16 BITES OSZTÁS ESETÉN ELŐTTE EDX-ET LE KELL NULLÁZNI 32 BITES OSZTÁS ESETÉN ELŐTTE HA PL.: TOMB1 WORD 183, 186, 187, 189, 190 esetén szeretnénk hivatkozni a TOMB1[1]-re, azaz a 186-ra (0-tól indul az indexelés), akkor a TOMB1 címke a nulladik elemet mutatja, tehát nem kell 4 bájtot hozzáadni, csak 2-t: MOV AX, [TOMB1+2] ; AX = [TOMB1+2] <-- 186
Többsoros komment:
COMMENT @ amit ide írok nem fog lefutni @
8. gyakorlat
2. kisZH
Ugró utasítások (Varga László)
A gyakorlati anyagban lévő feladatok megoldásai: gyak08.asm
Kiegészítés az órai anyaggal kapcsolatban:
1.(a) Feltételes ugrás:
CMP: két operandust hasonlít össze. A két operandus méretétől függően bizonyos ugrásokat hajthatunk végre a programon belül. Az alábbi táblázat mutatja be, hogy mikor mit kérdezünk le ugrás (művelet végrehajtás) előtt:
előjeles | JE | JNE | JG | JL | JGE | JLE | JNG | JNL | JNGE | JNLE |
---|---|---|---|---|---|---|---|---|---|---|
op1 ? op2 | == | != | > | < | >= | <= | !> | !< | !>= | !<= |
előjeltelen | JE | JNE | JA | JB | JAE | JBE | JNA | JNB | JNAE | JNBE |
Betűk eredete: Equal, Not, Greater, Less, Above, Below
Példa:
MOV EAX, 6 ; EAX = 6 MOV EBX, 5 ; EBX = 5 CMP EAX, EBX ; EAX és EBX összehasonlítása JG itt ; JG-vel megadjuk, ha a CMP parancs 1. operandusa (EAX) nagyobb volt, mint a 2. operandusa (EBX), akkor ugorjunk az "itt" címkéhez . . . itt: ; Mivel igaz volt az állítás (EAX > EBX), ezért itt fog folytatódni a program végrehajtása . . .
JCXZ: Jump if CX Zero, tehát az utána megadott címkéhez ugrik akkor, ha az ECX értéke 0.
1.(b) Feltétel nélküi ugrás:
JMP: (jump) egy operandusa van, az a címke, ahol szeretnénk, hogy a JMP utasítás végrehajtása után folytatódjon a program futása.
JMP itt . . . itt: ; <-- ide fog ugrani a vezérlés . . .
2. Ciklus:
LOOP: A tényleges ciklusképzést a LOOP utasítás végzi. Működése: csökkenti az ECX-et, majd ha az zérussá válik, akkor a LOOP utáni utasításra kerül a vezérlés, különben elugrik az operandus által mutatott memóriacímre. Tehát az ECX regisztert használjuk indexként. Minden egyes LOOP ciklusképzés előtt az ECX-et be kell állítani a megfelelő értékre. A csökkentés során egyetlen flag értéke sem változik meg.
ciklus: . . . ; elvégzünk bizonyos műveleteket LOOP ciklus ; ha ECX != 0, akkor csökkentjük eggyel az értékét és folytatjuk a 'ciklus' címkénél a ciklust
Gyakorlaton kívüli kiegészítő anyag (főleg a beadandó feladatokhoz)
Adatszegmensből való betöltés:
LODSB: (LOaD String Byte) az ESI címen levő bájtot betölti AL-be, majd az ESI-t eggyel növeli, ha DF = 0, illetve csökkenti, ha DF = 1.
LODSW: (LOaD String Word) az ESI címen levő szót (2B) betölti AX-be, majd az ESI-t 2-vel növeli vagy csökkenti DF-től függően.
LODSD: (LOaD String Doubleword) az ESI címen levő duplaszót (4B) betölti EAX-be, majd az ESI-t 4-gyel növeli vagy csökkenti DF-től függően.
.data SZAMSOR WORD 5, 10, 15, 20, 25 .code MOV ESI, offset SZAMSOR ; ESI a SZAMSOR első elemére mutat LODSW ; betöltődik az AX-be a SZAMSOR első eleme (5), majd 2-vel növelődik az ESI értéke
Egyetlen flag-et sem változtat meg. Megjegyzés: Ha hivatkozunk valamelyik flag-re, akkor a flag-ek betűjeleihez még hozzáírjuk az „F” betűt is. A CF (Carry), IF (Interrupt) és DF (Direction - a string műveletek iránya,) flag-ek értékét közvetlenül is befolyásolhatjuk.
9. gyakorlat
Tömbök és sztringek kezelése (Varga László)
A gyakorlati anyagban lévő feladatok megoldásai: gyak09.asm
Legfőbb hibák a 2. kisZH-ban: cwde != cwd, cwde: AX -> EAX, cwd: AX -> DX:AX cbw/cwd/cwde operandus nélküli utasítások! pl.: cbw bl ; ILYEN NINCS! - csak és kizárólag AL -> AX tömb címzések: [t+2] != t+2 != t[2] Regiszterek nevei/méretei! A változókat használjuk és nem konstansként kezeljük őket! (Emiatt most nem vontam le pontot) pl.: Adjuk át az A változó értékét az AX regiszternek. .data A word 5 .code MOV AX, 5 ; <- NEM helyes. Nem az volt a feladat, hogy 5-öt tegyünk az AX-be, hanem az A változó értékét. MOV AX, A ; <- HELYES
Következő gyakorlaton 3. kis ZH!
Összefoglaló:
Adott egy adatszegmens, pl.:
;... .data A dword 10 B byte 14 C word 147 T word 1, 5, 11, 12, 25 S byte 'Szeretem az Assembly-t <3', 0 ;...
1. Egy tömb vagy egy sztring feldolgozása a gyakorlaton látott példákhoz hasonló módon (3 pont). // Gyakorláshoz a 8. gyakorlati anyag végén lévő feladatok (Megoldás: gyak09.asm ).
2. A 2. kis ZH-hoz hasonlóan egy rövid aritmetikai utasítás kombináció végrehajtása (2 pont). // Gyakorláshoz az 5. gyakorlat gyakorló feladatai (Gyakorló feladatok).
10. gyakorlat
3. kisZH
Paraméter átadások eljárások számára I. (Varga László)
Kód kezdemény a gyakorláshoz: Tombok.asm
Kiegészítés az órai anyaggal kapcsolatban:
A gyakorlati anyagban tárgyalt három féle paraméter átadásra 1-1 egyszerű példa:
- Regiszter: param_regiszter.asm
- Adat szegmens: param_adatszegmens.asm
- Verem: param_verem.asm
11. gyakorlat
ELMARAD - Tavaszi szünet, avagy, hogy pótoljam be az elmúlt 10 hetet.
12. gyakorlat
Az anyagban található assembly - c++ kódot tartalmazó projekt: Addem.zip
Az anyagban található további kódok:
Kiegészítő segéd kód, az Irvine beépített függvények és az Invoke használatának megértéséhez:
Következő gyakorlaton 4. (utolsó) kis ZH!
A ZH írása SZÁMÍTÓGÉPEN fog történni.
Ugyanaz várható, mint a 3. kis ZH-ban, csak kicsit bonyolultabb kivitelben: elágazások, ciklusok tömbökön és sztringeken.
Minta ZH:
Feladatlap: ZH4_minta_2016.pdf
Keret a megoldáshoz: ProjectZH4.zip
( Megoldás: ZHkeret_04_mo.asm )
13. gyakorlat
4. kis ZH
Számok kiíratása 16 bites rendszerben (válogatás a 16 bites anyagból)
Következő gyakorlaton NAGY ZH!
Egy lehetésges megoldás: ZHkeret_nagyZH_mo.asm
14. gyakorlat
NAGY ZH!
15. gyakorlat
KÖTELEZŐ PROGRAM BEMUTATÁSA 05.18.-án (csütörtök) és 05.19.-én (péntek), MINDKÉT NAP 9:00 - 11:00 és 13:00 - 18:00, AZ IRODÁMBAN (ha épp nem vagyok benn, ne menjetek sehova, max pár percre tűntem el).
Védeni mindenkinek kötelező, aki még előtte nem tette meg és szeretne pontot kapni a programjára.