Wydanie R2019.06.1
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user