Ассамблея.Как вернуть значение из функции используя стек? - PullRequest
0 голосов
/ 26 апреля 2019

Я создаю программу, которая должна получить индекс числовой последовательности и вернуть значение номера этого индекса.Последовательность рекурсивна.Мой вопрос:

Как мне вернуть значение из функции, которая вычисляет ответ?Я сделал это, используя только регистры, затем я использовал стек для передачи параметров и регистр (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
...