Когда операционная система запускает процесс, она выделяет ему память под стек, но как низкоуровневый код узнает начальный адрес стека?
Если взять за основу эту схему, то становится понятно, как код процесса может узнать адреса текста, инициализированных данных, неинициализированных данных и кучи (просто прибавлять кол-во выделенной с помощью системных вызовов памяти к концу BSS). Однако, не ясно, как становится известен адрес стека и аргументов командной строки.
Если немного пораскинуть мозгами, то самый логичный ответ на этот вопрос - при запуске процесса ОС сама настраивает (думаю, что в данном примере не важно какая именно ОС, но я отталкиваю от примера linux) регистры стека на нужные значения, однако у меня нет опыта программирования на ассемблере (только теория), а все источники, которые я читал явно на это не указывают, поэтому я не могу быть уверен в этом предположении. Ну и если следовать этому предположению, то и адреса аргументов командной строки можно узнать отсчитав их от адреса стека.
Если все мои догадки верны, то хотелось бы получить утвердительный ответ от точно знающих это людей, если же используется другой способ, то хотелось бы получить подробное его описание.