Keresés

Új hozzászólás Aktív témák

  • Jester01

    veterán

    válasz plaschil #335 üzenetére

    Ha egyáltalán fogalmad sincs akkor az kemény menet lesz.
    Először is, az assembly az processzor(-család) specifikus dolog. Az említett 2 feladat 2 különböző processzorra kell. Mindkét esetben szükséged lesz a megfelelő utasításkészlet leírásra (instruction set reference) és persze az általános architektúra ismeretére. Amennyiben ki is akarod őket próbálni, úgy a fejlesztési eszközökre (toolchain) is szükséged lesz, ideértve egy debuggert és egy szimulátort is.

    Egyik feladat megfogalmazása sem egyértelmű, de kiindulásnak jó lesz ha egyfajta értelmezést elfogadunk.

    Nézzük az elsőt. Tegyük fel, hogy úgy értették, azt a 2 konstans számot kell BCD módban összeadni, majd az eredményt binárisan (egy byteon), BCD-ben és hexában (ez utóbbi kettőt ascii kóddal) megadni. A programban először összeadjuk őket binárisan majd a megadott "decimális korrekciót" alkalmazva kapjuk a bcd eredményt. Ezután ezt össze-vissza alakítjuk:
    - a bcd értéket egyesekre (e) és tízesekre (t) bontjuk
    - 00 ascii kódját hozzáadva kapjuk a decimális eredményt
    - 10t+e=8t+t+t+e képlettel kapjuk a bináris eredményt
    - amit pedig két 4 bites részre bontunk, ebből lesz egy-egy hexa számjegy amit táblázatból olvasunk ki

    Íme:

    mov al, 38h
    add al, 49h
    daa ; 38(bcd) + 49(bcd) = 87(bcd)
    mov dh, al ; copy (DH=87h)
    mov dl, al ; copy (DL=87h)
    shr dh, 4 ; tens (DH=08h)
    and dl, 0fh ; ones (DL=07h)
    mov al, dh ; tens (AL=08h)
    shl al, 3 ; 8 * tens (AL=40h)
    add al, dh ; 9 * tens (AL=48h)
    add al, dh ; 10 * tens (AL=50h)
    add al, dl ; 10 * tens + ones (AL=57h=87)
    add dx, 3030h ; convert to ascii (DX=3837h='87')
    movzx bx, al ; copy and zero BH (BX=57h)
    shr bl, 4 ; first hex digit (BX=05h)
    mov ch, [table+bx] ; get hex digit (CH=35h='5')
    mov bl, al ; copy (BX=57h)
    and bx, 0fh ; second hex digit (BX=07h)
    mov cl, [table+bx] ; get hex digit (CL=37h='7')
    ; results
    ; AL=binary (57h)
    ; CX=hex (3537h='57')
    ; DX=dec (3837h='87')

    ; lookup table for hex digits
    table: db '0123456789ABCDEF'

    (a táblázat olvasásnál feltételeztem, hogy CS=DS. Ha ez nem így van, akkor CS: előtag használata szükséges vagy a táblázatot kell a DS szegmensbe tenni.)

Új hozzászólás Aktív témák