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
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.
Jooh, munkin mielestä ihanaa että assyllakin coodataan <3
Melkein kolme vuotta edellisestä assenplyvinkistä :o
opin uuden käskyn: loop
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
Ohjelmoinnin aloittaminen assemblylla on kyllä hatun noston arvoinen teko!
Aihe on jo aika vanha, joten et voi enää vastata siihen.