Оба x86-подобны, где call
помещает адрес возврата (ПК) в стек. Обратите внимание, что ПК во время выполнения инструкции call
указывает на конец инструкции / начало следующей, поэтому ПК - это адрес инструкции, которая должна выполняться после ret
из call
.
2-я модель более четко описывает работу стека, соответствуя x86 push
/ pop
/ call
/ ret
. Это все изменилось.
MIPS jal
помещает адрес возврата в регистр (регистр связи $lr
является одним из 32 целочисленных регистров общего назначения в MIPS). Программное обеспечение может помещать его в стек вручную (например, в неконечные функции), но ISA не знает об этом / не заботится об этом.
MIPS даже архитектурно не имеет «указателя стека», который неявно используется для чего-либо. Callstack - это соглашение о программном обеспечении, хотя и очень полезное, которое, по существу, все программное обеспечение использует в основном так же, как x86, без единой инструкции, которая сочетает в себе изменение SP и загрузку или сохранение.
Единственное, что я понял, это две модели вызова функций с использованием стеков и выделения / освобождения куч. Один использует ПК, а другой использует SP.
Нет, это абсолютно неправильно на всех уровнях.
Прежде всего, ни один из примеров не показывает ничего о куче памяти, а только резервирует место для локальных переменных (автоматическое хранение) в стеке. Память, которая будет освобождена при возврате функции.
Память "кучи" является отдельной. Обычно это не одна вещь, например статическое и динамическое распределение обычно разделены в современных ОС. Но в любом случае, динамическое выделение кучи, такое как malloc
, даст вам указатель на память, которая все еще действительна после add sp, 16
или чего-либо еще и ret
, чтобы разрушить кадр стека текущей функции.
И, во-вторых, ПК вообще не участвует в распределении памяти . В деталях показано, что ПК читается как адрес возврата и записывается с помощью инструкций перехода / вызова / возврата. Он также известен как IP, указатель на инструкцию. На x86 32- и 64-разрядные версии регистра IP являются EIP / RIP соответственно.