Хранение стека при вызове функции - PullRequest
2 голосов
/ 09 апреля 2010

Когда мы вызываем функцию (скажем, с 3 параметрами), как переменные хранятся в памяти стека.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2010

Это полностью зависит от реализации, как аргументы передаются в функцию.

Аргументы функции могут даже не передаваться в стеке; например, они могут быть переданы в регистрах.

Вам нужно будет найти информацию для вашей конкретной платформы, чтобы определить, как передаются аргументы. В Википедии есть целая страница, посвященная различным соглашениям о вызовах x86 .

1 голос
/ 09 апреля 2010

Когда аргументы помещаются в стек, C делает это справа налево. Однако, в зависимости от архитектуры и количества параметров, возможно, что стек не будет использоваться (или использоваться только частично), и вместо него будут использоваться регистры.

Ради аргумента скажем, что мы имеем дело с архитектурой x86 (32-битной). Кадр стека будет выглядеть как ...

(Stack grows down.  High stack address is here)
arg3
arg2
arg1
ret addr         <--- Auto pushed by 'call'
old base ptr     <--- Called function typically saves the old base ptr
...              <--- Carve space for local variables
(Low stack address is here.)

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

movl  8(%ebp), %eax    // move arg1 into EAX
movl  12(%ebp), %edx   // move arg2 into EDX

и т. Д.

Если я правильно помню, в PowerPC есть что-то вроде восьми (8) регистров, доступных для передачи параметров - r3 ... r10 включительно. Что касается других архитектур, вам придется их искать.

Надеюсь, это поможет.

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