123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- # Jan Potocki 2019
-
- # Definicje numerow funkcji systemowych i ich parametrow
- SYSEXIT = 60
- SYSREAD = 0
- SYSWRITE = 1
- STDIN = 0
- STDOUT = 1
- STDERR = 2
-
- # Stale
- number = 5 # Wyraz ciagu (to mozna zmienic, reszty nie ruszac)
-
- n_size = 8 # Rozmiar bufora
-
- .bss
- num: .space n_size # Bufor
-
- .text
- .globl main
-
- fun:
- # Funkcja obliczajaca wynik ciagu:
- # x_0=2
- # x_1=1
- # x_2=3
- # x_i=x_(i-2) - 2*x_(i-3)
- # 1 parametr - wyraz ciagu (64-bit int), przekazywany przez rejestr
- # Wynik zwracany przez rejestr
-
- pushq %rbp # Wejscie do funkcji
- movq %rsp, %rbp
- pushq %rbx # Zachowanie wartosci rejestru rbx, poniewaz bedzie
- # pozniej modyfikowany - a wg konwencji wywolan, rbx
- # musi byc zachowany po stronie wywolanej funkcji
-
- cmpq $0, %rdi # rdi - 1. parametr (zgodnie z konwencja wywolan)
- je x0
- cmpq $1, %rdi
- je x1
- cmpq $2, %rdi
- je x2
-
- # Rekurencja
- # 1 wyraz
- subq $2, %rdi # Obliczenie indeksu nowego wyrazu ciagu
- pushq %rdi # Zachowanie wartosci rejestru rdi (wg konwencji
- # wywolan - po stronie wywolujacego)
- call fun # 1. wywolanie rekurencyjne
- popq %rdi # Przywrocenie wartosci rejestru rdi
- movq %rax, %rbx # Skopiowanie wyniku zwroconego w rejestrze rax
- # do rejestru rbx
-
- # 2 wyraz
- subq $1, %rdi # Obliczenie indeksu nowego wyrazu ciagu
- pushq %rdi # Zachowanie wartosci rejestru rdi (wg konwencji
- # wywolan - po stronie wywolujacego)
- call fun # 1. wywolanie rekurencyjne
- popq %rdi # Przywrocenie wartosci rejestru rdi
- movq $2, %rcx # Mnozenie 2. wyrazu przez 2
- mulq %rcx
-
- sub %rax, %rbx # Obliczenie roznicy
-
- # Zwrocenie wyniku obliczen (przez rejestr rax, zgodnie z konwencja) i wyjscie
- mov %rbx, %rax
- jmp fun_end
-
- # Zwrocenie wynikow dla poczatkowych wyrazow (przez rejestr rax)
- x0:
- mov $2, %rax
- jmp fun_end
-
- x1:
- mov $1, %rax
- jmp fun_end
-
- x2:
- mov $3, %rax
-
- fun_end:
- pop %rbx # Przywrocenie wartosci rejestru rbx
- pop %rbp # Wyjscie z funkcji
- ret
-
- main:
- movq $number, %rdi # Przekazanie parametru przez rejestr rdi
- call fun # Wywolanie funkcji rekurencyjnej
- movq %rax, num # Zapisanie w pamieci wyniku zwroconego przez rax
-
- # Wypisanie wyniku
- mov $SYSWRITE, %rax
- mov $STDOUT, %rdi
- mov $num, %rsi
- mov $n_size, %rdx
- syscall
-
- # Koniec programu
- mov $SYSEXIT, %rax
- mov $0, %rdi
- syscall
|