1. Gyakorlat
Követelmények
A gyakorlaton 1 db ZH dolgozatot kell teljesíteni az utolsó
alkalommal. A ZH-n maximum 50 pont szerezhető amelyből legalább
20 pontot el kell érni a gyakorlat teljesítéséhez. Ha valaki tehát
20, vagy annál több pontot szerez, akkor mehet vizsgázni.
Számrendszerek
Tanenbaum A Függelék. Számok konvertálása 2-es, 10-es, 16-os számrendszerek között.
Pl:
Hány különböző szám fejezhető ki n darab bináris számjegyen?
Helyik a legnagyobb?
Ha r az alap?
77d = 100 1101b = 4dh 185d = 1011 1001b = 0b9h bedh = 1011 1110 1101b = 3053d 19,625d = 1 0011,101b 114,25d = 111 0010,01bHány különböző szám fejezhető ki 1 bájton?
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 2-es, 16-os számrendszerben.
Negatív számok: előjeles abs érték, 1-es, 2-es komplemens, többletes.
Hajtsuk végre a következő számításokat 8 bites kettes komplemensű számokon:
Negatív számok: előjeles abs érték, 1-es, 2-es komplemens, többletes.
Hajtsuk végre a következő számításokat 8 bites kettes komplemensű számokon:
00101101 + 01101111 11111111 + 11111111
Lebegőpontos számábrázolás
Tanenbaum B függelék. IEEE szabvány egyszeres pontosságú, normalizált.
114.25 ==> 0100 0010 1110 0100 1000 0000 0000 0000b
= 42e4 8000h
39.25 ==> 421d 0000h
1.0625 ==> 3f88 0000h
3fc0 0000h ==> 1,5
Nem kötelező feladat: C program a konvertálásra?
Architektúrák
Mi a Neumann elv?
Valamikor 1 mikron átmérőjű volt a mikroprocesszor egy tranzisztora. Moore szabálya szerint mekkora volt az átmérője három évvel később?
Valamikor 1 mikron átmérőjű volt a mikroprocesszor egy tranzisztora. Moore szabálya szerint mekkora volt az átmérője három évvel később?
Feladatok
Mekkora a hexadecimális E6 és C7 Hamming távolsága?
Az alábbi memóriák közül melyik lehetséges, melyik ésszerű? Indokolja meg!
Az alábbi memóriák közül melyik lehetséges, melyik ésszerű? Indokolja meg!
10 bites címek 1024 db 8 bites rekesz 10 1024 12 9 1024 10 11 1024 10 10 10 1024 1024 10 10
2. Gyakorlat
Címzések
Szegmens:offszet címzés: Lineáris cím = segm * 16 + offs.
segm:1272h ===> *16 ===> 12720h
offs: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 helyzet a 0ffffh:0010h címmel?
Helyesek e az alábbi címzések? Ha igen, mely lineáris címre hivatkoznak? Tegyük fel, hogy a regiszterek tartalma: AX=0021h, BX= 0031h, CX=0001h, DX=0341h, SI=1223h, DI=0402h, DS=1234h SS=0405h, ES=2365h, BP=1200h;[BX + 0121h] [CX + 4] IP:[BX + SI + 0123h] ES:[SI + 0001] [123456789ABCh] ES:[09D3h] [SI-500d] SS:[BX+DI+1999d] [SI+DI] [IP] [BP+SI] DS:[BP+SI]
Összeadas
Tegyü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=CD mov ax, [0] ;ax=20CD
mov ax, 5h ;ax=0005h add al, 0001h ;ax=0006h
mov ax, 5h add al, [0001h] ;ax=0025h
mov ax, 5h mov bx, 6h add ax, bx ;ax=000Bh
mov ax, 5h mov bx, 6h add ax, [bx] ;ax=FEF5h
Szorzás
mov ax, 0102h mov cx, 0003h mul cl ;ax=0006h
mov ax, 0102h mov cx, 0003h mul cx ;dxax=0000 0306h
mov ax, 0202h mov si, 0003h ;ds:0003= 9fh mul byte ptr [si] ;ax=013eh
mov ax, 0602h mov si, 0003h ;ds:0003= 9f 00h mul word ptr [si] ;0602h*009fh = 0003 bb3eh
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ér 16 biten. Az eredményt tároljuk ax-ben.
(cx + ax ) * bxadd ax, cx mul bxbx * dx + ax
mov cx, ax ;ax mentése mov ax, dx ;csak ax-ben tudunk szorozni mul bx ;szorzás bx-el add ax, cx eredmény ax-benax * ax + bx * bx
mul ax ;ax*ax mov cx, ax ;ax mentése mov ax, bx ;bx-et attesszük ax-be mul ax ; add ax, cx ;eredmény ax-ben
Feladat
Számoljuk ki a következő kifejezés értékét! Az eredményt helyezzük AX-be!
min( a*c , a+b ) ahol, a és c 8, b 16 bites előjeltelen számok.
min( a*c , a+b ) ahol, a és c 8, b 16 bites előjeltelen számok.
mov al, a mul c ;ax=a*c mov bx, b ;bx=b mov cl, a ;cl=a xor ch, ch ;cx=a tizenhat biten add bx, cx ;bx=a+b cmp ax, bx ;flagek bx-ax szerint jb vege ;ha ax kisebb, ugrik mov ax, bx vege:Az adatszegmens
a db 4 c db 3 b dw 9A teljes forráskód letölthető innen.
3. Gyakorlat
Előjeles műveletek
Adjunk össze egy 8 bites előjeles számot és egy 16 bites előjeltelen számot!
Például a -10d-t és a 2525d-t.
mov al, -10d ;al=0f6h cbw ;ax=0fff6h mov bx, 2525d ;bx=09ddh add ax, bx ;ax=09d3hSzorozzuk össze a 8 bites -2d-t a szintén 8 bites 3d-vel!
mov al, -2d ;al=0feh mov cl, 3d ;cl=03h imul cl ;ax=fffahSzorozzunk össze egy 8 bites előjeles, ill. egy 16 bites előjeles számot! Például a -2d-t és a -520d-t.
mov al, -2d ;al=0feh cbw ;ax=0fffeh mov cx, -520d ;cx=0fdf8h imul cl ;dxax=0000 0410h azaz 1040d
Sztring hossza
Számoljuk meg, hogy milyen hosszú egy sztring! Tegyük fel, hogy a
sztringet a 0 karakter zárja.
mov cx, 0 ;szamlalo mov bx, offset hahostr betolt: mov al, [bx] cmp al, 0 je vege inc bx inc cx jmp betolt vege:Az adatszegmens
hahostr db "Haho !", 0A teljes forráskód letölthető innen.
100-nál nagyobb
Írjon programrészletet amely megszámolja az 50 elemű, szavakból álló A tömb
100-nál nagyobb elemeit!
Maximum
Keressük meg egy bájtokból álló számsorozat legnagyobb
elemét! A számsorozat hosszát a len változó tartalmazza.
Az eredményt taroljuk a max változóban.
mov cx, len ;cx= hossz
mov bx, offset sor ;bx-be kerul sor offsetje
xor dx, dx ;dx=0
betolt:
mov al, [bx] ;szam betöltése al-be
cmp al, dl ;ha kisebb= mint az eddigi legnagyobb
jbe kov ;ugorja át a következő utasítást
mov dl, al ;ez lesz az aktuális legnagyobb
kov:
inc bx ;index növelése
loop betolt
mov max, dl ;max valtozóba tároljuk el dl-t
Az adatszegmens pl. a következő is lehet:
adat segment
len dw 5
max db 0
sor db 4,5,2,7,3
adat ends
A teljes forráskód letölthető innen.
Számoljunk betűket
Számoljuk meg, hogy hány darab "a" betű van egy karakterláncban!
Párhuzamosan cseréljünk minden a betűt b betűre.
mov cl, 0 ;számláló
mov bx, offset text
mov si, 0
kov:
mov al, [bx+si] ;betöltjük a köv. betűt
cmp al, 0 ;elérkeztünk a végére?
je vege ;ha igen, ugrik a végére
cmp al, 'a' ;kell-e számolni
jne nemszamol ;ugrik, ha nem kell számolni
inc cl ;noveli a számlálót
mov byte ptr[bx+si], 'b'
nemszamol:
inc si
jmp kov
vege:
mov n, cl ;n-be rakjuk a végeredményt
A teljes forráskód letölthető innen.
Nagybetűk
Módosítsuk egy string kisbetűit, a megfelelő nagybetűkre.
mov cl, 0 ;számláló
mov bx, offset text
mov si, 0
betolt:
mov al, [bx+si] ;betöltjük a köv. betűt
cmp al, 0 ;elérkeztünk a végére?
je vege ;ha igen, ugrik a végére
cmp al, 'a' ;a-nal nagyobb?
jb kov ;ugrik, ha nem
cmp al, 'z' ;z-nel kisebb?
ja kov ;ugrik ha nem
add al, 'A'-'a'
mov [bx+si], al
kov:
inc si
jmp betolt
vege:
A teljes forráskód letölthető innen.
Házi feladat
Módosítsuk a maximum kereső programot hogy szavakból (dupla bájt) álló
számsorozatra is működjön.
Módosítsuk a maximum kereső programot minimum kereső programra! Azaz
keressük meg a sorozat legkisebb elemét. Figyeljünk a megfelelő kezdőértékekre!
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!
Módosítsuk a nagybetűsre konvertáló programot, hogy kisbetűkre konvertálja a
nagybetűket.
Módosítsuk a nagybetűsre konvertáló programot, hogy kisbetűket nagyra, a
nagybetűket kicsire konvertálja.
String fordítás
Fordítsunk meg egy stringet! Írjunk eljárást, amely egy string tartalmát
megfordítja. Az eljárás SI regiszterben várja a string elejét.
Megoldás verem használatával!
;eljárás ami megfordít egy stringet verem használatával.
;a string elejét SI mutatja
strvfordit proc
push si, di ;regiszterek mentése
mov cx, 0 ;számláló számolja a str. hosszát
mov di, si ;si mentése di
berak:
mov al, [si] ;betöltjük a betűt
cmp al, 0 ;0 jelzi a str végét
je berakvege
push ax ;betű be a verembe
inc cx ;számláló növelése
inc si ;si mutasson a köv betűre
jmp berak ;ugrás vissza a ciklus elejére
berakvege:
cmp cx, 0 ;számláló akkor 0, ha str üres volt
je strvforditvege
kivesz:
pop ax
mov [di], al
inc di
loop kivesz
strvforditvege:
pop di, si
ret
strvfordit endp
A teljes forráskód letölthető innen.
Verem használata nélkül!
;eljárás ami megfordít egy stringet.
;a string elejét SI mutatja
strfordit proc
push si di ;regiszterek mentése
mov di, si ;di fog mutatni a string végére
keres:
mov al, [di] ;de, először meg kell keresnünk a végét
cmp al, 0 ;vége?
je keresvege ;ha igen ugrik
inc di ;di mutasson a következő betűre
jmp keres ;ugrás a keresés elejére
keresvege:
mov ax, di
sub ax, si ;ax = di - si
cmp ax, 2 ;ha 0 v. 1 a hossz, akkor vege is
jb vege
dec di
csere:
mov al, [di]
xchg al, [si] ;kicseréli
mov [di], al ;[si]-t és [di]-t
inc si
dec di
cmp si, di ;vége?
jb csere
vege:
pop di si ;regiszterek visszatöltése
ret
strfordit endp
A teljes forráskód letölthető innen.
4. Gyakorlat
Paraméterek a veremben
Írjuk egy eljárást amely összead 2 számot. A paramétereket a veremben
adjuk át!
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 pop bx ;bx visszatöltése pop bp ;bp visszatöltése ret osszead endpA teljes forráskód letölthető innen.
n-el osztható számok
Számoljuk meg hány n-el 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: n
ndiv proc
push bp ;bp mentése
mov bp, sp ;bp = sp
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ó elemeket
kezd:
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övel
nemoszthato:
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
ret
ndiv endp
A teljes forráskód letölthető innen.
English