Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Resenje problema hanojskih kula
- #
- # Problem: Data su 3 stuba. Na prvi od njih je nanizano N diskova,
- # svaki manjeg precnika od onog ispod njega. Drugi i treci stubic su na pocetku prazni.
- # Cilj je prebaciti sve diskove sa prvog na treci stub, ali tako da veci disk nikada
- # ne bude iznad manjeg.
- #
- # Za detaljan opis problema i mogucih algoritama resenja pogledati:
- # http://en.wikipedia.org/wiki/Tower_of_Hanoi
- # N, broj diskova, se prosledjuje kao orgument komandne linije tj. argv[1]:
- # kule <br_diskova>
- # U resenju se koriste sledece funkcije C biblioteke:
- #
- # atoi
- # printf
- .data
- prebaci_str:
- .asciz "Prebaci sa stuba %d na stub %d\n"
- upotreba_str:
- .asciz "Upotreba: kule <br_diskova>\n"
- .text
- .globl main
- # int main(int argc, char *argv[])
- # argc - broj argumenata komandne linije
- # argv - niz pokazivaca na argumente
- # povratna vrednost - kod greske
- main:
- push %ebp
- mov %esp,%ebp
- mov 8(%ebp), %eax
- cmp $1, %eax
- jna nema_arg # ako je argc==1 -> nema argumenata
- mov 12(%ebp),%eax
- add $4,%eax
- mov (%eax),%edx
- push %edx
- call atoi # atoi (argv[1])
- add $4,%esp
- push $2
- push $1
- push $3
- push %eax
- call kule_pp # kule_pp(N, 3, 1, 2)
- add $16,%esp
- jmp kraj
- nema_arg:
- push $upotreba_str
- call printf # printf (upotreba_str)
- add $4,%esp
- kraj:
- mov $0, %eax # vrati 0
- mov %ebp,%esp
- pop %ebp
- ret
- #
- # void kule_pp(int n, int cilj, int start, int pomocni);
- # n - br. diskova koji se prebacuju
- # cilj - stub na koji se prebacuje
- # start - stub sa kog se prebacuje
- # pomocni - pomocni stub
- #
- # rekurzivno resava problem hanojskih kula
- #
- kule_pp:
- push %ebp
- mov %esp,%ebp
- mov 8(%ebp),%eax
- cmp $0,%eax
- jle kule_kraj # izadji ako je n==0 (kraj rekurzije)
- dec %eax
- pushl 12(%ebp)
- pushl 16(%ebp)
- pushl 20(%ebp)
- push %eax
- call kule_pp # kule_pp(n-1, pomocni, start, cilj);
- add $16,%esp
- pushl 16(%ebp)
- pushl 12(%ebp)
- call ispisi_pp # ispisi prebacivanje
- add $8,%esp
- mov 8(%ebp),%eax
- dec %eax
- pushl 16(%ebp)
- pushl 20(%ebp)
- pushl 12(%ebp)
- push %eax
- call kule_pp # kule_pp(n-1, cilj, pomocni, start)
- add $16,%esp
- kule_kraj:
- mov %ebp,%esp
- pop %ebp
- ret
- #
- # ispisi_pp(int cilj, int start);
- #
- # cilj - stub na koji se prebacuje
- # start - stub sa kog se prebacuje
- #
- # Ispisuje
- ispisi_pp:
- push %ebp
- mov %esp,%ebp
- pushl 8(%ebp)
- pushl 12(%ebp)
- push $prebaci_str
- call printf # printf(prebaci_str, start, cilj);
- add $12,%esp
- mov %ebp,%esp
- pop %ebp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement