Как значения возвращаются из функции, использующей стек - PullRequest
1 голос
/ 03 марта 2020

Предположим, этот код:

int add(int a, int b){
    int c = a+b;
    return c;
}

int main(){
  printf("%d\n", add(3,4));
}

Обычно это выполняется в сборке следующим образом:

- push 4 to stack
- push 3 to stack
- push return address which is the address of the next instruction, `print()` to stack
- call add
- do addition and push c on the stack
- pop c from stack ??
- return to main

Итак, что происходит с возвращаемым значением, оно не может быть включено кадр add, так как он будет очищен в конце. Помещается ли оно в стек main?

Предположим, что значения помещаются в цепочку, а не в регистр.

1 Ответ

1 голос
/ 03 марта 2020

Это зависит от архитектуры и соглашения о вызовах. В x86-32 почти каждое соглашение о вызовах имеет возвращаемое значение в eax или edx:eax для 64-битных результатов. Таким образом, ваша add функция может иметь инструкции:

mov eax, dword ptr [esp+4] ; put 1st arg in eax
add eax, dword ptr [esp+8] ; add eax with 2nd arg
ret                        ; return

Никаких дополнительных действий не требуется, поскольку предполагается, что возвращаемое значение уже находится в eax.

Это сказало, что вы не ' Мы не сможем найти ответ «общего случая» для этого, если только вы не спрашиваете об определенной c архитектуре, и даже в этом случае может быть несколько различных соглашений о вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...