Адрес подпрограммы CALL эквивалентен
PUSH адрес следующей инструкции + Адрес подпрограммы JMP .
В то же время, PUSH-адрес почти эквивалентен
SUB xSP, размер указателя + MOV [xSP], адрес .
SUBxSP, размер указателя можно заменить на PUSH .
RET почти эквивалентно
JMP [xSP] с последующим ADD xSP, адрес указателя в том месте, куда ведет JMP.
и ADD xSP, адрес указателя можно заменить на POP .
Итак, вы можете видеть, какую базовую свободу имеет компилятор.О, кстати, он может оптимизировать ваш код таким образом, чтобы ваша функция была полностью встроенной, и в нее не было ни вызова, ни возврата из нее.
Хотя это и несколько неверно, но невозможно придумать много более странных передач управления, используяинструкции и методы, специфичные для платформы (ЦП и ОС).
Вы можете использовать IRET вместо CALL и RET для передачи управленияпри условии, что вы поместили соответствующий материал в стек для инструкции.
Windows Structured Exception Handling
можно использовать таким образом, чтобы инструкция, вызывающая исключение ЦП (например, деление на 0, ошибка страницы и т. д.), отклоняласьвыполнение к вашему обработчику исключений, и оттуда управление может быть передано либо обратно той же инструкции, либо следующему, либо следующему обработчику исключений, либо в любое место.И большинство инструкций x86 могут вызывать исключения CPU.
Я уверен, что есть другие необычные способы передачи управления в, из и внутри подпрограмм / функций.
Весьма необычно видеть что-то в кодеили вот так:
...
CALL A
A: JMP B
db "some data", 0
B: CALL C ; effectively call C with a pointer to "some data" as a parameter.
...
C:
; extracts the location of "some data" from the stack and uses it.
...
RET
Здесь первый вызов - это не подпрограмма, это просто способ поместить в стек адрес данных, застрявших в середине кода.
Это, вероятно, написал бы программист, а не компилятор.Но я могу ошибаться.
Что я пытаюсь сказать со всем этим, так это то, что вы не должны ожидать, что CALL
и RET
будут единственными способами входить и выходить из подпрограмм, и вы не должныне ожидайте, что они будут использоваться только для этой цели и уравновешивают друг друга.