Advertisement
Lauda

Untitled

May 26th, 2012
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Resenje problema hanojskih kula
  2. #
  3. # Problem: Data su 3 stuba. Na prvi od njih je nanizano N diskova,
  4. # svaki manjeg precnika od onog ispod njega. Drugi i treci stubic su na pocetku prazni.
  5. # Cilj je prebaciti sve diskove sa prvog na treci stub, ali tako da veci disk nikada
  6. # ne bude iznad manjeg.
  7. #
  8. # Za detaljan opis problema i mogucih algoritama resenja pogledati:
  9. # http://en.wikipedia.org/wiki/Tower_of_Hanoi
  10.  
  11. # N, broj diskova, se prosledjuje kao orgument komandne linije tj. argv[1]:
  12. # kule <br_diskova>
  13.  
  14. # U resenju se koriste sledece funkcije C biblioteke:
  15. #
  16. #  atoi
  17. #  printf
  18.  
  19.  
  20. .data
  21. prebaci_str:
  22.         .asciz  "Prebaci sa stuba %d na stub %d\n"
  23.  
  24. upotreba_str:
  25.         .asciz  "Upotreba: kule <br_diskova>\n"
  26.  
  27. .text
  28. .globl main
  29.  
  30. # int main(int argc, char *argv[])
  31. # argc - broj argumenata komandne linije
  32. # argv - niz pokazivaca na argumente
  33. # povratna vrednost - kod greske
  34. main:
  35.         push   %ebp
  36.         mov    %esp,%ebp
  37.         mov    8(%ebp), %eax
  38.         cmp    $1, %eax
  39.         jna    nema_arg         # ako je argc==1 -> nema argumenata
  40.         mov    12(%ebp),%eax
  41.         add    $4,%eax
  42.         mov    (%eax),%edx
  43.         push   %edx
  44.         call   atoi             # atoi (argv[1])
  45.         add    $4,%esp
  46.         push   $2
  47.         push   $1
  48.         push   $3
  49.         push   %eax
  50.         call   kule_pp          # kule_pp(N, 3, 1, 2)
  51.         add    $16,%esp
  52.         jmp    kraj
  53.  
  54. nema_arg:
  55.         push   $upotreba_str
  56.         call   printf           # printf (upotreba_str)
  57.         add    $4,%esp
  58. kraj:  
  59.         mov    $0, %eax         # vrati 0
  60.         mov    %ebp,%esp
  61.         pop    %ebp
  62.         ret    
  63. #
  64. # void kule_pp(int n, int cilj, int start, int pomocni);
  65. # n - br. diskova koji se prebacuju
  66. # cilj - stub na koji se prebacuje
  67. # start - stub sa kog se prebacuje
  68. # pomocni - pomocni stub
  69. #
  70. # rekurzivno resava problem hanojskih kula
  71. #
  72. kule_pp:
  73.         push   %ebp
  74.         mov    %esp,%ebp
  75.         mov    8(%ebp),%eax
  76.         cmp    $0,%eax
  77.         jle    kule_kraj        # izadji ako je n==0 (kraj rekurzije)
  78.         dec    %eax
  79.         pushl  12(%ebp)
  80.         pushl  16(%ebp)
  81.         pushl  20(%ebp)
  82.         push   %eax
  83.         call   kule_pp          # kule_pp(n-1, pomocni, start, cilj);
  84.         add    $16,%esp
  85.         pushl  16(%ebp)
  86.         pushl  12(%ebp)
  87.         call   ispisi_pp        # ispisi prebacivanje
  88.         add    $8,%esp
  89.         mov    8(%ebp),%eax
  90.         dec    %eax
  91.         pushl  16(%ebp)
  92.         pushl  20(%ebp)
  93.         pushl  12(%ebp)
  94.         push   %eax
  95.         call   kule_pp          # kule_pp(n-1, cilj, pomocni, start)
  96.         add    $16,%esp
  97.  
  98. kule_kraj:
  99.         mov    %ebp,%esp
  100.         pop    %ebp
  101.         ret    
  102.  
  103. #
  104. # ispisi_pp(int cilj, int start);
  105. #
  106. # cilj - stub na koji se prebacuje
  107. # start - stub sa kog se prebacuje
  108. #
  109. # Ispisuje
  110. ispisi_pp:
  111.         push   %ebp
  112.         mov    %esp,%ebp
  113.         pushl  8(%ebp)
  114.         pushl  12(%ebp)
  115.         push   $prebaci_str
  116.         call   printf           # printf(prebaci_str, start, cilj);
  117.         add    $12,%esp
  118.         mov    %ebp,%esp
  119.         pop    %ebp
  120.         ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement