вызов помещает текущее значение регистра RIP (обратный адрес) в стек + делает вызов
RET выталкивает обратный адрес (то вызова толкаемых) от верхней части стеки (RSP там регистрируются регистры) и записывает их в регистр RIP.
Пример в ящике GNU/Linux: функция f вызывает функцию g и позволяет посмотреть на фрейм g.
НИЗКИЙ АДРЕС
... < - RSP (указатель стека показывает вершину стека) регистр точек по этому адресу
местные вары г в
указатель базы F 'S (старое значение ОДП) < - ОДП (указатель базы) регистрирует точки по этому адресу
адрес в отставке F 'S (старое значение RIP) (это то, что вызов (от е) толкнул, и что RET (от г) выскочит)
утверждает, что f называется g с и не вписывается в регистры (я думаю, что в Windows это другое)
...
ВЫСОКОГО АДРЕС
г освободит местный ВАР (MOVQ% РСП,% РСБ)
г выскочит «старый ОПБ» и хранить его в ОДПЕ регистре (поп% РСБ)
г будет RET, который изменит RIP со значением, которое хранится где RSP указует на
Надеется, что это помогает
Как 'call' сделка с ним тогда? Я просто хочу, чтобы увидеть, где * в отставке адрес * является указанному – Mask
. Вы должны разбить метод вызова на дополнительный шестнадцатеричный код. Об этом будет сказано в чит-листе для набора инструкций, заданных для конкретного процессора. Например, если вы возьмете простейший из микропроцессоров 8085, а инструкция ADD X не покажет второе значение (допустим Y, как ADD X, Y). Вместо этого он добавит значение X к некоторому зарезервированному регистру в процессоре, скажем H, и сохранит значение в H. Бит переполнения должен быть сохранен в другом регистре. Именно так разработана инструкция ADD. Команда CALL также будет иметь аналогичные предопределенные правила. – bragboy
Часть задания команды вызова заключается в том, чтобы направить адрес возврата в стек. Обратный адрес - это адрес непосредственно после параметров для команды вызова. Чтобы узнать, какой адрес возврата находится в вашем примере выше, вам нужно будет посмотреть на стек, как только программа войдет в процедуру на 0x4012d0. –