Következő gyakorlaton NagyZH!
A ZH írása SZÁMÍTÓGÉPEN fog történni és egész órás lesz.
Minta NagyZH:
Feladatlap: Assembly_NagyZH_Minta_2016.pdf
Keret a megoldáshoz: ProjectNagyZH.zip
( 3. és 4. feladat megoldása: ZHkeret_NagyZH_minta_mo.asm )
A MarkMyProfessor egy weboldal, ahol oktatókat lehet értékelni. Az alábbi linken elérhető az én adatlapom is. Itt az értékelőknek ki kellene választania az "Assembly programozás gyakorlat"-ot a tanított tárgyak közül és utána értékelni, majd az Értékelem gomb lenyomásával véglegesíteni.
Pl.: ilyen és ehhez hasonló érvek alapján: megtartottam-e az órákat, értelmesen adtam-e elő, tudtam is az anyagot vagy csak össze vissza beszéltem, lehetett-e kérdezni, tudtam-e válaszolni a kérdésekre, igyekeztem-e segítséget nyújtani ZH-kon, mennyire voltam segítőkész órákon/órák után/hét közben, válaszoltam-e az email-ekre, mennyire voltak élvezhetőek az órák, mennyire voltam jó arc, stbstb..
Szeretném kérni, hogy a szöveges megjegyzéshez is írjatok mindenképpen valamit, mivel csak úgy van igazán értelme, a számok nem sokat mondanak. :)
Számok kiíratása és sztring műveletek (válogatás a tavalyi anyagból)
Az anyagban található assembly - c++ kódot tartalmazó projekt: Addem.zip
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 )
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
Tavaszi szünet, avagy, hogy pótoljam be az elmúlt 8 hetet!
Tömbök és sztringek kezelése (Varga László)
A gyakorlati anyagban lévő feladatok megoldásai: gyak08.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.
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.
2. kisZH
Ugró utasítások (Varga László)
A gyakorlati anyagban lévő feladatok megoldásai: gyak07.asm
Kiegészítés az órai anyaggal kapcsolatban:
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
Közvetlenül flag-ek alapján:
JZ, JC, JS, JO, JP - ugrás ha a flag igaz
JNZ, JNC, JNS, JNO, JNP - ugrás ha a flag hamis
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.
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 . . .
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
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.
A múltheti (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 bármely parancs (kivéve: SHL, SHR, ROL, ROR) - 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 @
1. kisZH
Kódkezdemény gyakorláshoz: Szamok32.asm
Kiegészítés az órai anyaggal kapcsolatban:
Regiszter tartalmának nullázása (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.
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
Kiegészítés a regiszter indirekt címzéshez:
.data val DWORD 15h .code MOV ESI, offset val ; az ESI fog ezutan a "val"-ra mutatni MOV EAX, [ESI] ; 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!
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).
Számrendszerek (Varga László)
Egy összefoglaló táblázat a tanulmányozott számrendszerekhez:
Az anyaghoz kapcsolódó gyakori hibák ZH-n:
- 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.
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.
A gyakorlati követelmények megtekinthetőek lesznek a félév folyamán itt a honlapomon, CooSpace-en és ETR-ben is.
A gyakorlat anyaga elérhető Varga László honlapján. Egyéb kiegészítő anyagok pedig itt lesznek megtalálhatók.
Kurzusfórumnak a CooSpace-t fogjuk használni. A gyakorlat részteljesítéseinek (kisZH, nagyZH, kötprog) 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 (na nem szó szerint) és megbeszéljük, ha van kérdés, illetve email-ben állok rendelkezésetekre ( Leko.Gabor@stud.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 emailek kategorizálásakor, kérem mindenki tartsa be ).
A fogadóórám időpontja azt jelzi, hogy abban az időpontban elérhető vagyok minden héten, viszont nem mindig tartózkodom bent a Tanszéken. Tehát, ha valaki szeretne jönni fogadóórára, várom sok szeretettel, csak előző nap éjfélig írjon egy email-t, hogy biztos benn legyek. A fogadóórám időpontja, illetve további információk az elérhetőségemmel kapcsolatban megtekinthetők a Kapcsolat menüpont alatt.
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. )
Nagy eltérés az eddigi évekhez képest, hogy idén 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.
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 .
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 .
Vissza a lap tetejére.