Różne programy na zajęcia laboratoryjne z AK2
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

rekurencja-reg.s 2.5KB

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 rejestr
  23. # Wynik zwracany przez rejestr
  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, %rdi # rdi - 1. parametr (zgodnie z konwencja wywolan)
  30. je x0
  31. cmpq $1, %rdi
  32. je x1
  33. cmpq $2, %rdi
  34. je x2
  35. # Rekurencja
  36. # 1 wyraz
  37. subq $2, %rdi # Obliczenie indeksu nowego wyrazu ciagu
  38. pushq %rdi # Zachowanie wartosci rejestru rdi (wg konwencji
  39. # wywolan - po stronie wywolujacego)
  40. call fun # 1. wywolanie rekurencyjne
  41. popq %rdi # Przywrocenie wartosci rejestru rdi
  42. movq %rax, %rbx # Skopiowanie wyniku zwroconego w rejestrze rax
  43. # do rejestru rbx
  44. # 2 wyraz
  45. subq $1, %rdi # Obliczenie indeksu nowego wyrazu ciagu
  46. pushq %rdi # Zachowanie wartosci rejestru rdi (wg konwencji
  47. # wywolan - po stronie wywolujacego)
  48. call fun # 1. wywolanie rekurencyjne
  49. popq %rdi # Przywrocenie wartosci rejestru rdi
  50. movq $2, %rcx # Mnozenie 2. wyrazu przez 2
  51. mulq %rcx
  52. subq %rax, %rbx # Obliczenie roznicy
  53. # Zwrocenie wyniku obliczen (przez rejestr rax, zgodnie z konwencja) i wyjscie
  54. movq %rbx, %rax
  55. jmp fun_end
  56. # Zwrocenie wynikow dla poczatkowych wyrazow (przez rejestr rax)
  57. x0:
  58. movq $2, %rax
  59. jmp fun_end
  60. x1:
  61. movq $1, %rax
  62. jmp fun_end
  63. x2:
  64. movq $3, %rax
  65. fun_end:
  66. popq %rbx # Przywrocenie wartosci rejestru rbx
  67. popq %rbp # Wyjscie z funkcji
  68. ret
  69. main:
  70. movq $number, %rdi # Przekazanie parametru przez rejestr rdi
  71. call fun # Wywolanie funkcji rekurencyjnej
  72. movq %rax, num # Zapisanie w pamieci wyniku zwroconego przez rax
  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