Onko mahdollista muuntaa jonkin rekisterin arvo numeroiksi, esim. tehtäessä kello-ohjelmaa joka lukee kellon ajan johonkin rekisteriin ja tulostaa rekisterin sisältämät NUMEROARVOT ruudulle.
Ja onko tasm kaupallinen ohjelma ja mistä sen saa?
-arttu
TASM on kaupallinen (afaik), toisin kuin MASM. Eli hanki MASMin sisältävä MASM32-paketti: http://www.masm32.com tai NASM: http://nasm.sourceforge.net/ MASMiin DOS-linkkeri: http://win32asm.cjb.net
Itse kysymykseen vastaus toki on. Taas olisi tietysti ollut mukava jos ympäristö, prosessori yms. asiat olisi kerrottu. Veikkaan että puhut x86:sta (DOS?).
Jokatapauksessa, homma hoituu melko näppärästi jakojäännöstä hyväksikäyttämällä. Sitten vain konvertoidaan ne ASCII-merkeiksi (käytännössä lisätään numero-arvoon 30h, eli 48. Kun luku loppuu käsiin, jaettu on 0. Kokeillaanpas jotain asmia vääntää:
.data ascValue db 10 dup(?) ; pieni bufferi .code mov ax, @data mov ds, ax mov si, (offset ascValue)+9 ; ds:si = pointteri bufferin loppuun mov byte ptr [si], '$' ; terminaattori mov ax, 3983 ; luku joka muunnetaan ASCIIksi mov bx, 10 ; luku jolla jaetaan getNext: cwd ; konvertoidaan wordi doubleksi (eli ax->dx:ax) div bx ; jaetaan test ax, ax ; onko ax 0? jz bailOut ; jos, niin bailOutiin tiemme vie dec si ; seuraava ; ax = kokonaisluku-osa, dx = jakojäännös add dl, 30h ; muunnetaan ASCIIksi mov [si], dl ; siirretään bufferiin jmp getNext ; seuraava bailOut: mov dx, si ; pointteri tulostettavaan merkkijonoon mov ah, 9h ; DOS-tekstin ulostus int 21h
Ei mene suoraan assemblerista läpi, luulen ;) Mutta jotain tuon suuntaista. Tuossa on muuten sen luokan kikkailua paikoittain että saattaa mennä aloittelijalta hieman yli, ei mitään dramaattista kuitenkaan.
TASMia ei tosiaan taida olla vielä vapautettu ilmaisjakeluun, Turbo Pascal ja Turbo C++ sen sijaan löytyvät Borlandin omilta sivuiltakin (http://bdn.borland.com/museum/).
Selvitän vielä vähän fawkzin ideaa, asm-toteutusta en edes yritä vääntää. :)
Luku 3983 pitäisi saada tulostetuksi. Jaetaan lukua kymmenellä, jakojäännökset huomioiden, kunnes jaon tulos on 0.
3983 / 10 = 398, jää 3
398 / 10 = 39, jää 8
39 / 10 = 3, jää 9
3 / 10 = 0, jää 3
Nyt jakojäännökset käänteisessä järjestyksessä muodostavat luvun ja näin luvun osat on saatu erotettua. Ja kuten sanottu, ASCII-merkistössä lukujen merkit saa suoraan 48 + luku.
edit: lisätty linkki
Aihe on jo aika vanha, joten et voi enää vastata siihen.