Я собираюсь ответить только на эту часть вопроса:
Разве параметры не должны быть помещены в стек перед вызовом?Почему argc и argv размещены по смещению 20 и 32 от базового указателя текущего кадра стека?
Параметры для main
действительно устанавливаются кодом, который вызывает main
.
Это, похоже, код, скомпилированный в соответствии с 64-битным psABI ELF для x86 , в котором первые несколько параметров любой функции передаются в регистры , а не встек.Когда элемент управления достигнет метки main:
, argc
будет в edi
, argv
будет в rsi
, а третий аргумент, обычно называемый envp
, будет в rdx
.(Вы не объявляли этот аргумент, поэтому вы не можете его использовать, но код, который вызывает main
, является универсальным и всегда устанавливает его.)
Инструкции, которые, я полагаю, вы ссылаетесь на
mov DWORD PTR [rbp-20], edi
mov QWORD PTR [rbp-32], rsi
- это то, что ботаники компилятора называют spill инструкциями: они копируют начальные значения параметров argc
и argv
из своих исходных регистров в стек, на всякий случай, если эти регистрынужны для чего-то еще.Как отметили несколько других людей, это неоптимизированный код;эти инструкции не нужны и не будут отправлены, если вы включили оптимизацию.Конечно, если бы вы включили оптимизацию, вы бы получили код, который вообще не касается стека:
main:
mov eax, 2
ret
В этом ABI компилятору разрешено помещать «слоты разлива»,msgstr "в который сохраняются значения регистров, , где он хочет в кадре стека.Их расположение не должно иметь смысла и может варьироваться от компилятора к компилятору, от уровня исправления до уровня исправления одного и того же компилятора или с явно не связанными изменениями в исходном коде.
(Некоторые ABI действительно задают кадр стекав некоторых деталях, например, IIRC, 32-битный Windows ABI для Windows, чтобы облегчить «раскрутку», но это сейчас не важно.)
(чтобы подчеркнуть, что аргументы main
находятся в регистрах,это сборка, которую я получаю в -O1
из
int main(int argc) { return argc + 1; }
:
main:
lea eax, [rdi+1]
ret
Все еще ничего не делает со стеком (кроме ret
.))