Assembly programozás gyakorlat 2015-2016/2

13. gyakorlat


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 )



MarkMyProfessor

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





12. gyakorlat


Számok kiíratása és sztring műveletek (válogatás a tavalyi anyagból)





11. gyakorlat


Invoke és Irvine eljárások


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

Osszeg_invoke.asm

KarakterKereso_invoke.asm

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





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





9. gyakorlat


Tavaszi szünet, avagy, hogy pótoljam be az elmúlt 8 hetet!





8. gyakorlat


Tömbök és sztringek kezelése (Varga László)

A gyakorlati anyagban lévő feladatok megoldásai: gyak08.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.

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.





7. gyakorlat


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.





6. gyakorlat


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
@




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




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

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!




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





2. gyakorlat


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.





1. gyakorlat


Követelmények ismertetése

A gyakorlati követelmények megtekinthetőek lesznek a félév folyamán itt a honlapomon, CooSpace-en és ETR-ben is.

Egyéb hasznos információk

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.