Я создаю программу, которая должна получить индекс числовой последовательности и вернуть значение номера этого индекса.Последовательность рекурсивна.Мой вопрос:
Как мне вернуть значение из функции, которая вычисляет ответ?Я сделал это, используя только регистры, затем я использовал стек для передачи параметров и регистр (rax) для возврата значения.И теперь я должен использовать стек для передачи параметров и возврата значения.Я не знаю, как настроить весь кадр до «ret», а затем как получить ответ после возвращения на домашний адрес (следующая строка после «call function»).
Моя не рабочая версиякод с передачей параметров по стеку и возвращением значения по стеку (пожалуйста, пропустите комментарии на моем иностранном языке):
# przez stos
.section .data
# x_i = 3*x_(i-1) - 2*x_(i-2), x_0 = 5, x_1 = 2
.section .bss
.comm text, 512
.section .text
.globl _start
_start:
push $4 # zadany indeks
push $5 # wczesniejsza wartosc
push $2 # pozniejsza wartosc
call znajdz
break2:
pop %rax
add $24, %rsp
break3:
wynik_rax:
mov %rax, %rdi
mov $60, %rax
syscall
.type znajdz, @function
znajdz:
push %rbp
mov %rsp, %rbp
sub $8, %rsp
mov 16(%rbp), %r9 # %r9 - pozniejszy wyraz
mov 24(%rbp), %r8 # %r8 - wczesniejszy wyraz
mov 32(%rbp), %rdx # %rdx - indeks
cmp $0, %rdx
je zerowy_indeks
cmp $1, %rdx
je pierwszy_indeks
mov %r9, %r10 # zapisanie kopii pozniejszego wyrazu w %r10
mov %r9, %rax
mov $3, %rdi
push %rdx
imul %rdi
mov %rax, %rbx
mov %r8, %rax
mov $-2, %rdi
imul %rdi
pop %rdx
add %rax, %rbx
mov %rbx, %r9 # %r9 - wyliczona wartosc
mov %r10, %r8 # %r8 - wartosc wczesniejszego wyrazu
dec %rdx
cmp $1, %rdx
je koniec
push %rdx
push %r8
push %r9
call znajdz ###
add $24, %rsp
jmp koniec
zerowy_indeks:
mov $5, %rax
jmp koniec
pierwszy_indeks:
mov $2, %rax
jmp koniec
koniec: ##### quitting the function, the place to look after #####
# push %r9
mov %rbp, %rsp
pop %rbp
# mov %r9, %rax
push %r9
break1:
ret