Я писал программу, которая принимает много аргументов в качестве входных параметров.Я решил скопировать все из них, которые были пропущены через регистры, в стек.Чтобы сделать итерацию более согласованной, я решил сохранить адрес возврата функции в одном из регистров, который не использовался в то время.Всякий раз, когда я переопределял обратный адрес, программа вылетала.Ниже вы можете найти небольшой фрагмент кода, который иллюстрирует проблему.В чем причина?Защищен ли обратный адрес каким-либо образом?
section .text
global _function
_function:
mov rdx, rsp ; save return address
mov rsp, 2 ; override return address, crashes here (segfault)
mov rsp, rdx ; restore address
ret
C программа:
#include <stdio.h>
extern int function (int n, ...);
int main() {
printf("%d", function(7, 1, 1, 1, 1, 1, 1, 2));
}