3. Teszt
adat segment v1 DB 3 v2 DW 4 adat ends
Feladat
v1 és v2 előjeltelen számok. Helyezd el az összeguket ax-ben!
Megoldás: v1 8 bites, tehát csak AL-be lehet betölteni. Mivel előjeltelen,
ezért, símán 0-kat írhatunk AH-ba. AX-ben tehát 16 bites érték, amihez
gond nélkül hozzá lehet adni a szintén 16 bites v2-t. Kész is.
mov al, v1
mov ah, 0
add ax, v2
Feladat
v1 és v2 előjeles számok. Helyezd el az összeguket ax-ben!
Megoldás: v1 8 bites, tehát csak AL-be lehet betölteni. Mivel előjeles,
a cbw utasítást kell használni, hogy 16 bites legyen.
AX-hez gond nélkül hozzá lehet adni a szintén 16 bites v2-t.
mov al, v1
cbw
add ax, v2
Feladat
cx és dx előjeltelen számokat tartalmaznak. Helyezd el a kisebbiket ax-ben!
Megoldás:Hasonlítsuk össze őket. Ha cx a kisebb, ugrik a címkére, és cx-et
töltjük ax-be. Ha cx nem kisebb, akkor dx-et töltjük ax-be. Vigyázat, nem szabad
"rácsorogni" az else ágbol a then ágra! Ezt előzi meg a jmp vege utasítás.
cmp cx, dx
jb cxakisebb
mov ax, dx
jmp vege
cxakisebb:
mov ax, cx
vege:
Vagy másképpen is lehet gondolkodni: tegyük bele az egyiket (mondjuk cx-et) ax-be,
és ha nem jó akkor tegyük bele a másikat.
mov ax, cx ;nem biztos hogy cx a kisebb, de lehet
cmp cx, dx ;hasonlítsuk össze
jb kesz ;ha jol tippeltünk az előbb, ugorjunk
mov ax, dx
kesz:
Ha a számok előjelesek lettek volna, jl utasítást kellett volna használni a jb helyett.
Feladat
Számoljuk ki az alábbi kifejezés értékét! (Feltesszük, h. minden művelet eredménye
elfér 16 biten.)
ax = ax*dx + cx*dx
Megoldás: Kicsit rémisztően néz ki, de csak egyszerű utasításokat használ.
mov bx, dx ;dx-et elmentem
mul dx ;ax=ax*dx , bx=dx
mov dx, ax ;dx=ax=ax*dx , bx=dx
mov ax, cx ;dx=ax*dx , ax=cx , bx=dx
mov cx, dx ;cx=ax*dx , ax=cx , bx=dx
mul bx ;cx=ax*dx , ax=cx*dx
add ax, cx ;ax=cx*dx + ax*dx
Néhány utasítást meg lehet spórolni ha használjuk az xchg-t
mov bx, dx ;dx-et elmentem
mul dx ;ax=ax*dx , bx=dx
xchg ax, bx ;ax=dx , bx=ax*dx
mul cx ;ax=cx*dx , bx=ax*dx
add ax, bx ;ax=cx*dx + ax*dx
Örülök, hogy néhányan használták a fejüket is:
add ax, cx ;ax=ax+cx
mul dx ;ax=(ax+cx)*dx=cx*dx + ax*dx
English