Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Muunto (asm)

Carlossaatana [28.02.2003 10:27:22]

#

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

thefox [28.02.2003 13:58:27]

#

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.

Antti Laaksonen [01.03.2003 00:33:20]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta