У меня есть следующие сомнения:
Как мы знаем, System V x86-64 ABI дает нам информацию о области фиксированного размера (128 байт) в фрейме стека, так называемой redzone.
Итак, в результате нам не нужно использовать, например, sub rsp, 12
. Просто сделайте mov [rsp-12], X
и все.
Но я не могу понять это. Почему это имеет значение? Нужно ли sub rsp, 12
без красной зоны? В конце концов, размер стека ограничен в начале, так почему важно sub rsp, 12
? Я знаю, что это позволяет нам следить за вершиной стека, но в этот момент игнорировать его.
Я знаю, что некоторые инструкции используют значение rsp
(например, ret
), но в этот момент его не волнует.
Суть проблемы: У нас нет redzone, и мы сделали:
function:
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
ret
Разница?
function:
sub rsp, 1024
mov [rsp-16], rcx
mov [rsp-32], rcx
mov [rsp-128], rcx
mov [rsp-1024], rcx
add rsp, 1024
ret