Download - Assembly Programozás Gyakorlat 2011
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 1/9
1. Gyakorlat
SzámrendszerekSzámok konvertálása 2es, 10es, 16os számrendszerek között. Pl:77d = 100 1101b = 4Dh185d = 1011 1001b = 0B9hBEDh = 1011 1110 1101b = 3053d
19,625d = 1 0011,101b114,25d = 111 0010,01b
Hány különböző szám fejezhető ki n darab bináris számjegyen? Helyik a legnagyobb? Ha r az alap?
MűveletekÖsszeadás, kivonás 2es, 16os számrendszerben. Negatív számok: 1es, 2es komplemens.
MemóriakezelésSzegmens: offszet címzés: Lineáris cím = segm * 16 + offs.segm:1272h ===> *16 ===> 12720hoffs:1a3bh + 1a3bh ‐‐‐‐‐‐‐ 1415bh lineáris cím
Egy lineáris címnek hány logikai (szegmens:offszet) címe van? Mondjunk olyan logikai címeket, melyek az 12345h lineáris címre mutatnak! Mi a helyzeta0ffffh:0010h címmel?Mi a különbség a lineáris cím és a fizikai cím között?
CímzésKódba épített adatCímzés: [BX v. BP] + [SI v. DI] + [rel8 v. rel16]
Alapértelmezett szegmens: DS, vagy BP használata esetén SS. Szegmens felülbírálássalCS, DS, ES, SS elérhető. Alternatív jelölésmódok: [BX][SI], vagy 04h[BX]
CímzésekMelyik címzés helyes és melyik nem?[12h+56h]ES:[09D3h][ 123456789ABCh] [SI+DI] [IP] [SI‐500d][AX] SS:[BX+DI+1999d][CX+1234h] [SP+BP] DS:[BP+SI]IP:[0000h]
2. gyakorlat
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 2/9
Turbo DebuggerCsomagold ki a tasm.zip állományt egy tetszőleges könyvtárba. A td.exet kell elindítani.
MASMA MASM elérhető a kabinetes gépeken. A MASM használata.
ÖsszeadasTegyük fel hogy a következő példákban az adatszegmensünk így néz ki: ds:0000 CD 20 FF 9F 00 9A F0 FE
mov al, [0] ;al=CDmov ax, [0] ;ax=20CD Bájtsorrend!!
mov ax, 5h ;ax=0005hadd al, 0001h ;ax=0006h
mov ax, 5hadd al, [0001h] ;ax=0025h
mov ax, 5hmov bx, 6hadd ax, bx ;ax=000Bh
mov ax, 5hmov bx, 6hadd ax, [bx] ;ax=FEF5h
Adjunk össze egy 8 bites előjeles számot és egy 16 bites előjeltelen számot! Például a10dt és a 2525dt.mov al, ‐10d ;al=0f6hmov bx, 2525d ;bx=09ddhcbw ;ax=0fff6hadd ax, bx ;ax=09d3h
Szorzásmov ax, 0102hmov cx, 0003hmul cl ;ax=0006h
mov ax, 0102hmov cx, 0003hmul cx ;dxax=0000 0306h
mov ax, 0202hmov si, 0003h ;ds:0003= 9fhmul byte ptr [si] ;ax=013eh
mov ax, 0602hmov si, 0003h ;ds:0003= 9f 00hmul word ptr [si] ;0602h*009fh = 0003 bb3eh
Előjeles szorzás:mov al, ‐2d ;al=0fehmov cl, 3d ;cl=03himul cl ;ax=fffah
Szorozzunk össze egy 8 bites előjeles, ill. egy 16 bites előjeles számot! Például a 2dt ésa 520dt.mov al, ‐2d ;al=0fehcbw ;ax=0fffehmov cx, ‐520d ;cx=0fdf8h
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 3/9
imul cl ;dxax=0000 0410h azaz 1024d
3. gyakorlat
FeladatÍrjunk egy programrészletet, amely kiszámolja az alábbi kifejezés értékét! Feltesszük,hogy minden regiszter előjeltelen számot tartalmaz és minden művelet eredménye elfér16 biten. Az eredményt tároljuk axben.
(cx + ax ) * bx bx * dx + ax ax * ax + bx * bx
GyakorlásLegyen a 8 bites előjeles (pl. 2), b 16 bites előjeles (3), és c 8 bites előjeltelen (130d)szám. Adjuk össze őket!
Osztásmov ax, 0007hmov cx, 0003hdiv cl ; ax= 0102h
Osszuk el a 1234ht 00hval! Mi fog történni? Osszuk el a 1234ht 03hval!
FeladatLegyen a és b 8 bites előjeltelen, c pedig 16 bites előjeles. Számoljuk ki a (a*b + c) / bkifejezést!
4. gyakorlat
Feltételes ugrásokSzámoljuk ki a következő kifejezés értékét! Az eredményt helyezzük AX regiszterbe! AX := min( a*c , a+b )
adat segment a db 4 ;elojeltelen c db 3 ;elojeltelen b dw 9 ;elojeltelenadat ends
Oldjuk meg a feladatot előjeles számokra is! További kifejezések: AX := max(a+b, a+c) AX := mid(a,b,c) AX := (a+b) == c ? a : b+c AX := abs(a+b)
5. gyakorlat
Üres assembly programAz üres assembly program nem tartalmaz mást, mint azokat a kötelező utasításokat,amelyek a program elindulásához és befejeződéséhez kellenek.
Sztring hossza
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 4/9
Számoljuk meg, hogy milyen hosszú egy sztring! Tegyük fel, hogy a sztringet a 0 karakterzárja. Az adatszegmensünk a következő:adat segment hahostr db "Haho !", 0adat ends
A teljes forráskód letölthető innen.
Turbo DebuggerTurbo Debugger (TASM) használata. Ahhoz hogy a Debuggerben a forrásprogramunkatis lássuk, a következőképpen kell a fordítást és a linkelést végezni (%1 a forrásfile nevekiterjesztés nélkül)tasm /zd %1.asmtlink /v %1.obj
Debuggolás: td.exe
MASMA MASM elérhető a kabinetes gépeken. A MASM használata. A fordítás menete MASMhasználatával:masm %1.asm,,,,link %1.obj,,,,
Debuggolás: debug
FeladatokOldjuk meg az alábbi feladatokat a sztring hossza program átírásával!1. Számoljuk meg, hogy hány darab "a" betű van egy karakterláncban!2. Cseréljünk le egy string minden "a" betűjét "b" betűre.3. Titkosítás: Cseréljünk ki minden betűt (AZ, és az) az "x" betűre, az egyéb
karaktereket hagyjuk meg.4. Cseréljünk le egy string minden kisbetűjét nagybetűre (UPPER CASE). Mit kell
módosítani a programon, hogy a nagybetűkből legyenek kisbetűk? (lower case)5. Invetáljuk a kis és nagy betűket egy karaktersorozatban. (iNVERT cASE)6. A szavak első betűjét állítsuk nagybetűsre, a többi részét pedig kisbetűsre. A szavakat
szóközök választják el. (Proper Case)
Szöveg kiírásaÍrjunk eljárást, amely kiírja az ALben található karaktert a képernyőre.;eljárás ami kiír egyetlen betűt. a betű kódját al‐ben;várjabetukiir proc ;al ben a kiirandó betű mov ah, 14 ;BIOS rutin paramétere int 10h ;10h megszakítás hívása ret ;visszatérésbetukiir endp
Írjunk eljárást, ami kiír egy 0val záródó karakterláncot a képernyőre!;eljárás ami kiír egy 0‐val záródó karakterláncot;a string elejét si mutatjastrkiir proc kov: mov al, [si] ;következő betű cmp al, 0 ;0 jelzi a str végét je strvege ;ha elértünk a végére ugrunk call betukiir ;egy betű kiirása inc si ;mutató a következő betűre
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 5/9
jmp kov ;ugrás strvege: ret ;eljárás végestrkiir endp
A teljes forráskód letölthető innen.
6. gyakorlat
Szám kiírásaÍrjunk ki egy előjeltelen 16 bites számot decimális alakban a képernyőre! Algoritmus: aszámot osztjuk tízzel. A maradékot kiírjuk, a hányadost pedig tovább osztjuk.;eljárás, ami kiír egy számot decimális alakban;a számot ax regiszterben várjaszamkiir proc mov bx, 10d ;számrendszer alapja mov cx, 0 ;verembe tett számok számlálójak1: cmp ax, 0 ;addig osztunk amíg nulla nem lesz je v1 ;ha nulla ugrik mov dx, 0 ;a kov ut. dx:ax‐et osztja! div bx ;osztás bx push dx ;maradek a verembe inc cx jmp k1v1: jcxz cxnulla ;ugrik, ha nem tettünk semmit a verembek2: pop ax ;kiveszünk egy értéket a veremből add al, '0' ;hozzáadjuk a '0' ASCII kódját call betukiir ;kiírjuk a számot (mint betűt) loop k2 ;jöhet a következő jmp v2cxnulla: mov al, '0' ;ha ax‐ben 0 volt, call betukiir ;írjunk ki egy 0‐tv2: retszamkiir endp
A teljes forráskód letölthető innen. Feladatok:1. Írjuk át a programot, hogy 8 bites számokat írjon ki a képernyőre.2. Írjuk át a programot, hogy más számrendszerben is ki tudjon írni számokat.3. Írjuk át a programot, hogy előjeles számot is ki tudjon írni.
MaximumKeressük meg egy bájtokból álló számsorozat legnagyobb elemét! A számsorozathosszát a len változó tartalmazza. Az eredményt taroljuk a max változóban. Azadatszegmens pl a következő is lehet:adat segment len dw 5 max db 0 sor db 4,5,2,7,3adat ends
Feladatok:1. Módosítsuk a maximum kereső programot hogy szavakból (dupla bájt) álló
számsorozatra is működjön.2. Módosítsuk a maximum kereső programot minimum kereső programra! Azaz keressük
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 6/9
meg a sorozat legkisebb elemét. Figyeljünk a megfelelő kezdőértékekre!3. Egészítsük ki a maximum kereső programot, hogy a legnagyobb szám első/utolsó
előfordulási helyét a "pos" változóban tároljuk!
7. gyakorlat
String beolvasás billentyűzetrőlIrjunk egy eljárást, ami a billentyűzetről beolvas egy sztringet egy bufferbe.; eljárás ami beolvas egy stringet az SI altal mutatott bufferbestrolvas proc push si ;si mentése olv: mov ah, 1h ;bios eljárás sorszáma int 21h ;bios interrupt cmp al, 0dh ;enter kódja je olvasvege mov [si], al ;betű tárolása a memóriában inc si ;a következő betű egyel magasabb mem. címre kerüljön jmp olv ;vissza az olvasás elejére
olvasvege: mov byte ptr [si], 0 ;a string veget 0‐val lezárjuk mov ax, 0e0ah ;újsor karakter kiírása int 10h pop si retstrolvas endp
String fordításFordítsunk meg egy stringet! Írjunk eljárást, amely egy string tartalmát megfordítja. Azeljárás SI regiszterben várja a string elejét. Kiindulási forrás: strford.asm.
Oldjuk meg a feladatot a verem használata nélkül!Használjuk a vermet a megoldáshoz!Használjuk a sztingkezelő utasításokat
8. gyakorlat
Paraméterek a veremben!Írjuk egy eljárást amely összead 2 számot. A paramétereket a veremben adjuk át! ... mov ax, 2d push ax mov ax, 4d push ax call osszead add sp, 4 ...
osszead proc push bp ;bp mentése mov bp, sp ;verem teteje push bx ;bx mentése mov bx, [bp+4] ;2. paraméter mov ax, [bp+6] ;1. paraméter add ax, bx ;összeadás
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 7/9
pop bx ;bx visszatöltése pop bp ;bp visszatöltése retosszead endp
A teljes forráskód letölthető innen.
ÁtlagÍrjunk egy eljárást, amely kiszámolja egy sorozat átlagát! Az eljárásnak 2 paraméterelegyen (melyeket a veremben kap): az első a sorozat offsetje, a második a sorozathossza. Kiindulási forrás a gyakorlati munkához: atlag.asm
SkalárszorzatÍrjunk eljárást, ami 2 n hosszúságú vektor skalárszorzatát határozza meg! Aparamétereket a vermen keresztül kapja! A teljes forráskód letölthető innen.
9. gyakorlat
RendezésÍrjunk programot, sorbarendez egy bájtokból álló előjeltelen számsorozatot. Működési elv:a sorozat minden egyes elemére végrehajtjuk a következőket: végigmegyünk arákövetkező elemeken, és ha kisebbet találunk mint az aktuális, akkor megcseréljük őket.;eljárás bx‐ben várja a bájtsorozat elejét;ha talál az első elemnél kisebb elemet, akkor ;megcseréli őketmin proc mov dl, [bx] ;dl‐ben az elso szám mov si, bx ;si mutasson az elejérek1: mov al, [si] ;akt szám betöltése cmp al, 0 ;nulla? je v1 ;ha igen: vége cmp al, dl ;akt. szám és az eddigi legkisebb jae k2 ;ha az akt. nagyobb ugorjunk mov dl, al ;jegyezzük meg mert kisebb xchg al, [bx] ;csere mov [si], al ;cserek2: inc si ;köv betű jmp k1 ;v1: ret ;visszatérésmin endp
;eljárás, mely rendez egy bájtsorozatotrendez prock3: mov al, [bx] ;akt szám betölt cmp al, 0 ;nulla? je v2 ;ha igen: vége call min ;tegyük az elejére a legkisebbet inc bx ;köv betű jmp k3 v2: ret ;eljárás végerendez endp
A teljes forráskód letölthető innen. Feladatok: Írjuk át a programot úgy hogy, ...számoljuk, hogy hány csere történik, majd irassuk ki a cserék számát képernyőre!kiírja az eredeti és a rendezett sorozatot is a képernyőre!előjeles számokat kezeljen! Írjuk meg a szamkiir eljaras előjeles változatát is!16 bites számokat kezeljen!csökkenő sorrendbe rendezze a számokat!
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 8/9
ASCII to IntegerÍrjuk meg az atoi() függvényt előjeltelen számokra. A teljes forráskód letölthető innen. mov si, [bp+4] ;parameter atvetele mov cx, 10 ;számrendszer alapja mov ax, 0 ;ax‐ben lesznek a részeredmények mov bh, 0 ;bl‐ben lesz az aktuális számjegy, bh‐ban meg nullakovszamjegy: mov bl, [si] ;betöltünk egy betűt cmp bl, 0 ;vége‐e a sztringnek? je vege sub bl, '0' ;levonja az első számjegy ASCII kódját, megkapjuk az értékét mul cx ;eddigi részeredmény x 10 add ax, bx ;hozzáadjuk az aktuális számjegyet inc si ;lépés a köv betűre jmp kovszamjegyvege:
Feladatok: Írjuk át a programot úgy hogy, ...hexadecimális/bináris számokra működjön!előjeles számokat kezeljen!lebegőpontos számokat is kezeljen!
Gyakorló feladatok ZHra
StringekString esetén a kezdőcím SI regiszterben van megadva, ill. a végét a 0 jelzi. Azeredményt (feltéve hogy van) AXben kell tárolni.1. Határozd meg az első "a" betű pozícióját (az első betű a nulladik, a második az első,
stb...)! Ha nincs "a" betű a stringben legyen 1 a visszatérési érték!2. Számold meg hány betű van egy stringben a szóközök és írásjelek nélkül!3. Számold meg hány szó van egy sztringben. (dupla szóközök esetén a szavak száma
nem változik!)4. Konvertáld a stringet csupa nagy, ill. kisbetűsre! (To uppercase / to lower case)5. Egy string összes nagybetűjét váltsd kicsire, a kicsiket pedig nagyra! (Invert case)6. Minden szó kezdőbetűjét állítsd nagybetűsre! (Capitalize)7. Határozd meg hány kisbetű ( nagybetű, számkarakter, írásjel ) van a szövegben!8. Határozd meg melyik betű hányszor fordul elő. (Pl. DI egy 256 elemű táblázat elejét
mutatja)(hisztogram)9. Határozd meg, hogy a DI által mutattot string betűi hányszor fordulnak elő összesen!10. Határozd meg, hogy a DI által mutattot string hányszor fordul elő!11. Határozd meg a DI által mutatott string első/utolsó előfordulasának pozícióját! (strstr)12. Határozd meg a szóismétlések számát! (na, ez már durva...)
Számsorozatok, tömbökSzámsorozat kezdőcíme SIben, a hossza CXben van megadva. Az eredményt (feltévehogy van) AXben kell tárolni. A sorozat lehet előjeles/előjeltelen, 8/16 bites.1. Határozd meg hány darab szám esik 100 és 200 közé!2. Határozd meg a legnagyobb/legkisebb számot!3. Határozd meg a legnagyobb/legkisebb szám (első/utolsó előfordulásának) pozícióját!4. Határozd meg a legnagyobb/legkisebb szám előfordulásainak számát!5. Számolj átlagot/szórást.6. Határozd meg hányszor szerepel két egyforma szám egymás mellett!7. Határozd meg hányszor szerepel két egyforma abszolult értékű szám egymás mellett!8. Határozd meg hányszor szerepel n darab egyforma szám egymás mellett!9. Határozd meg hány nel osztható szám van a sorozatban!
2015. 03. 20. Assembly programozás gyakorlat 2011
data:text/html;charset=utf8,%3Ch4%20style%3D%22fontfamily%3A%20Verdana%2C%20Arial%2C%20sansserif%3B%20fontsize%3A%2014px%3B… 9/9
10. Határozd meg hány négyzetszám van a sorozatban!11. Határozd meg hány előjelváltás történik a sorozatban!12. Határozd meg, hogy a számsorozat növekvő/csökkenő sorrendben van e! AX legyen
1, ha igen, különben 0.13. Határozd meg, hogy a számsorozat számtani sorozatot alkot e. AX legyen 1, ha igen,
különben 0.14. Határozd meg, hogy a számsorozat mértani sorozatot alkot e. AX legyen 1, ha igen,
különben 0.15. Határozd meg, hogy a számsorozat Fobonaccisorozatot alkot e. AX legyen 1, ha igen,
különben 0.16. Határozd meg, a leghosszabb növekvő/csökkenő részsorozat hosszát. AX legyen 1,
ha igen, különben 0.
nel osztható számokSzámoljuk meg hány nel osztható szám van egy sorozatban!;eljárás amelyik meghatározza, h. hány n‐el osztható ;szám van sorozatban. Az eredményt ax‐be teszi.;1. param: 16 bites előjeltelen sorozat eleje;2. param: hossz;3. param: nndiv proc push bp ;bp mentése mov bp, sp ;bp = si push si bx cx dx;regiszterek mentése
mov si, [bp+8];sorozat eleje mov cx, [bp+6];hossz mov bx, 0 ;számolja az n‐el osztható elemeketkezd: mov ax, [si] ;ax‐be a sor következő eleme mov dx, 0 ;a köv. div dx:ax‐et osztja! div word ptr [bp+4] ;osztunk n‐el cmp dx, 0 jne nemoszthato inc bx ;számláló növelnemoszthato: add si, 2 ;kov elem loop kezd mov ax, bx ;eredmény ax‐be pop dx cx bx si;regiszterek visszatöltése pop bp retndiv endp
A teljes forráskód letölthető innen.