Różne programy na zajęcia laboratoryjne z AK2
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

rekurencja-stack.s 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Jan Potocki 2019
  2. # Definicje numerow funkcji systemowych i ich parametrow
  3. SYSEXIT = 60
  4. SYSREAD = 0
  5. SYSWRITE = 1
  6. STDIN = 0
  7. STDOUT = 1
  8. STDERR = 2
  9. # Stale
  10. number = 5 # Wyraz ciagu (to mozna zmienic, reszty nie ruszac)
  11. n_size = 8 # Rozmiar bufora
  12. .bss
  13. num: .space n_size # Bufor
  14. .text
  15. .globl main
  16. fun:
  17. # Funkcja obliczajaca wynik ciagu:
  18. # x_0=2
  19. # x_1=1
  20. # x_2=3
  21. # x_i=x_(i-2) - 2*x_(i-3)
  22. # 1 parametr - wyraz ciagu (64-bit int), przekazywany przez stos
  23. # Wynik zwracany przez stos
  24. pushq %rbp # Wejscie do funkcji
  25. movq %rsp, %rbp
  26. pushq %rbx # Zachowanie wartosci rejestru rbx, poniewaz bedzie
  27. # pozniej modyfikowany - a wg konwencji wywolan, rbx
  28. # musi byc zachowany po stronie wywolanej funkcji
  29. cmpq $0, 16(%rbp) # 16(%rbp) - 1. parametr przekazany na stosie
  30. je x0
  31. cmpq $1, 16(%rbp)
  32. je x1
  33. cmpq $2, 16(%rbp)
  34. je x2
  35. # Rekurencja
  36. # 1 wyraz
  37. movq 16(%rbp), %rax # Obliczenie indeksu nowego wyrazu ciagu
  38. subq $2, %rax
  39. pushq %rax # Przekazanie nowego wyrazu przez stos
  40. call fun # 1. wywolanie rekurencyjne
  41. popq %rbx # Zapisanie w rbx wyniku przekazanego przez stos
  42. # 2 wyraz
  43. movq 16(%rbp), %rax # Obliczenie indeksu nowego wyrazu ciagu
  44. subq $3, %rax
  45. pushq %rax # Przekazanie nowego wyrazu przez stos
  46. call fun # 2. wywolanie rekurencyjne
  47. popq %rax # Zapisanie w rax wyniku przekazanego przez stos
  48. movq $2, %rcx # Mnozenie 2. wyrazu przez 2
  49. mulq %rcx
  50. subq %rax, %rbx # Obliczenie roznicy
  51. # Zwrocenie wyniku obliczen (przez stos) i wyjscie
  52. movq %rbx, 16(%rbp)
  53. jmp fun_end
  54. # Zwrocenie wynikow dla poczatkowych wyrazow (przez stos)
  55. x0:
  56. movq $2, 16(%rbp)
  57. jmp fun_end
  58. x1:
  59. movq $1, 16(%rbp)
  60. jmp fun_end
  61. x2:
  62. movq $3, 16(%rbp)
  63. fun_end:
  64. popq %rbx # Przywrocenie wartosci rejestru rbx
  65. popq %rbp # Wyjscie z funkcji
  66. ret
  67. main:
  68. movq $number, %rax # Przekazanie parametru...
  69. pushq %rax # ...przez stos
  70. call fun # Wywolanie funkcji rekurencyjnej
  71. popq %rax # Zapisanie w rax wyniku zwroconego przez stos
  72. movq %rax, num # Zapisanie wyniku w pamieci
  73. # Wypisanie wyniku
  74. movq $SYSWRITE, %rax
  75. movq $STDOUT, %rdi
  76. movq $num, %rsi
  77. movq $n_size, %rdx
  78. syscall
  79. # Koniec programu
  80. movq $SYSEXIT, %rax
  81. movq $0, %rdi
  82. syscall