Как обратный адрес указан в стеке?

Это - то, чем я вижу, демонтируют для оператора function(1,2,3);:

movl   $0x3,0x8(%esp)
movl   $0x2,0x4(%esp)
movl   $0x1,(%esp)
call   0x4012d0 <_Z8functioniii>

Кажется, что мочить адрес не продвинут в стек вообще, затем как делает ret работа?

8
задан Mask 30 March 2010 в 04:59
поделиться

3 ответа

В идеале об этом должен позаботиться оператор call . Следующая позиция счетчика программ будет помещена в стек. Когда функция (подпрограмма), которая была вызвана, завершает свою работу и когда она встречает оператор return, элемент управления переходит на адрес, который был помещен в стек, и он выскакивает.

5
ответ дан 5 December 2019 в 10:40
поделиться

Это зависит от ABI и архитектуры, но если адрес возврата попадает в стек, это побочный эффект вызова инструкция, которая помещает его туда.

3
ответ дан 5 December 2019 в 10:40
поделиться

На процессоре x86 (как в примере на языке ассемблера) инструкция call помещает адрес возврата в стек и передает управление к функции.

Не все архитектуры процессоров помещают адрес возврата в стек - часто есть набор из одного или нескольких регистров, предназначенных для хранения адресов возврата. На процессорах ARM команда BL помещает адрес возврата в специальный регистр ( LR или «регистр связи») и передает управление функции. Процессор ia64 делает нечто подобное, за исключением того, что есть несколько возможных регистров ( b0 - b7 ), которые могут получать адрес возврата, и один будет указан в инструкции (с b0 по умолчанию).

7
ответ дан 5 December 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: