Tesztfeladatok és megoldásaik

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