Wydanie R2019.06.1

This commit is contained in:
Jan Potocki
2019-06-01 14:39:21 +02:00
commit e74d77ce3b
10 changed files with 418 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
rekurencja-reg: rekurencja-reg.s
gcc -g rekurencja-reg.s -o rekurencja-reg -no-pie
rekurencja-stack: rekurencja-stack.s
gcc -g rekurencja-stack.s -o rekurencja-stack -no-pie
all: rekurencja-reg rekurencja-stack
clean:
rm -f rekurencja-reg rekurencja-stack
+101
View File
@@ -0,0 +1,101 @@
# 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
+101
View File
@@ -0,0 +1,101 @@
# 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 stos
# Wynik zwracany przez stos
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, 16(%rbp) # 16(%rbp) - 1. parametr przekazany na stosie
je x0
cmpq $1, 16(%rbp)
je x1
cmpq $2, 16(%rbp)
je x2
# Rekurencja
# 1 wyraz
movq 16(%rbp), %rax # Obliczenie indeksu nowego wyrazu ciagu
subq $2, %rax
pushq %rax # Przekazanie nowego wyrazu przez stos
call fun # 1. wywolanie rekurencyjne
popq %rbx # Zapisanie w rbx wyniku przekazanego przez stos
# 2 wyraz
movq 16(%rbp), %rax # Obliczenie indeksu nowego wyrazu ciagu
subq $3, %rax
pushq %rax # Przekazanie nowego wyrazu przez stos
call fun # 2. wywolanie rekurencyjne
popq %rax # Zapisanie w rax wyniku przekazanego przez stos
movq $2, %rcx # Mnozenie 2. wyrazu przez 2
mulq %rcx
subq %rax, %rbx # Obliczenie roznicy
# Zwrocenie wyniku obliczen (przez stos) i wyjscie
movq %rbx, 16(%rbp)
jmp fun_end
# Zwrocenie wynikow dla poczatkowych wyrazow (przez stos)
x0:
movq $2, 16(%rbp)
jmp fun_end
x1:
movq $1, 16(%rbp)
jmp fun_end
x2:
movq $3, 16(%rbp)
fun_end:
popq %rbx # Przywrocenie wartosci rejestru rbx
popq %rbp # Wyjscie z funkcji
ret
main:
movq $number, %rax # Przekazanie parametru...
pushq %rax # ...przez stos
call fun # Wywolanie funkcji rekurencyjnej
popq %rax # Zapisanie w rax wyniku zwroconego przez stos
movq %rax, num # Zapisanie wyniku w pamieci
# Wypisanie wyniku
movq $SYSWRITE, %rax
movq $STDOUT, %rdi
movq $num, %rsi
movq $n_size, %rdx
syscall
# Koniec programu
movq $SYSEXIT, %rax
movq $0, %rdi
syscall