Это - то, чем я вижу, демонтируют для оператора function(1,2,3);
:
movl $0x3,0x8(%esp)
movl $0x2,0x4(%esp)
movl $0x1,(%esp)
call 0x4012d0 <_Z8functioniii>
Кажется, что мочить адрес не продвинут в стек вообще, затем как делает ret
работа?
В идеале об этом должен позаботиться оператор call
. Следующая позиция счетчика программ будет помещена в стек. Когда функция (подпрограмма), которая была вызвана, завершает свою работу и когда она встречает оператор return, элемент управления переходит на адрес, который был помещен в стек, и он выскакивает.
Это зависит от ABI и архитектуры, но если адрес возврата попадает в стек, это побочный эффект вызова
инструкция, которая помещает его туда.
На процессоре x86 (как в примере на языке ассемблера) инструкция call
помещает адрес возврата в стек и передает управление к функции.
Не все архитектуры процессоров помещают адрес возврата в стек - часто есть набор из одного или нескольких регистров, предназначенных для хранения адресов возврата. На процессорах ARM команда BL
помещает адрес возврата в специальный регистр ( LR
или «регистр связи») и передает управление функции. Процессор ia64 делает нечто подобное, за исключением того, что есть несколько возможных регистров ( b0
- b7
), которые могут получать адрес возврата, и один будет указан в инструкции (с b0
по умолчанию).