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.

    Beadandó feladatok listája

    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!

MintaZH


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

Adatmozgató utasítások

Aritmetikai utasítások

    Gyakorló feladatok

    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

ASCII kódtábla


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




Invoke és Irvine eljárások


Az anyagban található assembly - c++ kódot tartalmazó projekt: Addem.zip

Az anyagban található további kódok:

Osszeg_invoke.asm

KarakterKereso_invoke.asm

ShowTime.asm

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:

IrvineInvoke.asm


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)

    szamkiir16.asm


Következő gyakorlaton NAGY ZH!

    Minta keret

    Minta feladatsor

    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.