Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Assembly: Fibonaccin lukujono

aaämdee [12.11.2007 17:16:39]

#

Yksinkertainen ohjelma, joka laskee 24 ensimmäistä fibonaccin lukujonon lukua
Kielenä on assembly

fibo.asm

;Laskee Fibonaccin lukujonon 24 ensimmäistä lukua
;http://fi.wikipedia.org/wiki/Fibonaccin_lukujono

;Kääntyy ainakin nasm:lla - nasm -f bin -o fibo.com fibo.asm
;Toimii Dossilla, mutta toimii luultavasti muillakin, kun
;korvaa ohjelman lopetuksen jollain toisella koodilla
;(int 21h on dossin keskeytys...)

[org 100h]	;DOS-ohjelma

mov al, 1
mov bl, 0

mov cx, 24	;laskettavien lukujen määrä
			;24 koska ohjelma on 16-bittinen
			;ja seuraava luku ei enää mahdu
			;16 bittiin

luuppi:		;fibonaccia laskeva silmukka alkaa
call tulosta ;Tulostetaan rekisterissä ax oleva luku
push ax
add ax, bx	;ax = ax+bx
pop bx
loop luuppi	;loop vähentää cx:ää yhdellä ja hyppää alkuun, jos cx>0
			;Aika lopettaa ohjelma...
mov ah, 0	;odotetaan vielä
int 16h		;näppäinpainallusta

mov ah, 4Ch	;ohjelma
int 21h		;suljetaan

			;Loppuosa koodia tulostaa numeron näytölle.
tulosta:	;Tulosta-funktio lukee numeron
push ax		;rekisteristä ax ja tulostaa sen.
push bx
push cx
xor cx, cx
mov bx, 10
cmp ax, 9	;Jos luku on yli 9, joudutaan se tulostamaan osissa
ja numerot
call tulosta_numero	;jos ei, niin tulostetaan se suoraan
mov ah, 0Eh
xor al, al
int 10h
pop cx
pop bx
pop ax
ret		;Takaisin pääohjelmaan

numerot:	;Tämä jakaa luvun osiin ja työntää ne pinoon.
cmp ax, 10	;esim. 1234 -> push 4, push 3, push 2
jb tulosta2	;1 jää työntämättä. Se pitää tulostaa erikseen
xor dx, dx
div bx
push dx
inc cx
jmp numerot

tulosta2:
call tulosta_numero	;tulostetaan se työntämättä jäänyt numero
luuppi2:	;tulostetaan numerot pinosta
pop ax
call tulosta_numero
loop luuppi2
mov ah, 0Eh
xor al, al
int 10h
pop cx
pop bx
pop ax
ret		;Takaisin pääohjelmaan

;tulostaa yksimerkkisen numeron, numerot 0-9 löytyy ascii-taulukosta 30h-39h
tulosta_numero:
push ax			;funktio lukee numeron rekisteristä al
add al, 30h
mov ah, 0Eh
int 10h		;kutsutaan BIOS:n tulostuskeskeytystä 10,E arvolla (30h+al)
pop ax
ret

Antti Laaksonen [12.11.2007 18:31:43]

#

Hauska nähdä pitkästä aikaa assembly-ohjelmointia. Assembly on kyllä vähän huono, kun luvun tulostus on noin tavattoman monimutkaista. Seuraava haaste voisi olla sama ohjelma niin, että luvut lasketaan rekursiivisella funktiolla.

moptim [12.11.2007 18:49:05]

#

Jooh, munkin mielestä ihanaa että assyllakin coodataan <3

Melkein kolme vuotta edellisestä assenplyvinkistä :o

Dude [12.11.2007 22:06:20]

#

opin uuden käskyn: loop

aaämdee [12.11.2007 23:12:10]

#

niinpä.. taisi tässä aika vähälle tuo fibonaccin laskeminen jäädä verrattuna tuohon tulostamiseen.
Olen vasta aloittelija assemblyssä(ja niin kyllä ohjelmoinnissa ylipäänsä) ja luulin aloittaessani, että tulostus olisi vähän yksinkertaisempaa... suurin osa ajasta taisi sittenkin mennä sopivan tulostusmenetelmän miettimiseen :p

OsQu [10.12.2007 16:57:08]

#

Ohjelmoinnin aloittaminen assemblylla on kyllä hatun noston arvoinen teko!

Vastaus

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

Tietoa sivustosta