Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_Лекции_2011_01.docx
Скачиваний:
8
Добавлен:
31.07.2019
Размер:
521.09 Кб
Скачать

Чтобы узнать, что происходит в памяти, при размещении и извлечении значений в стеке, см. На рисунок ниже:

Смещение

1203

1204

1205

1206

1207

1208

1209

120A

120B

Значение

00

00

00

00

00

00

00

00

00

ESP

(стек здесь заполнен нулями, но в действительности это не так, как здесь). ESP стоит в том месте, на которое он указывает)

mov ax, 4560h push ax

Смещение

1203

1204

1205

1206

1207

1208

1209

120A

120B

Значение

00

00

60

45

00

00

00

00

00

ESP

mov cx, FFFFh push cx

Смещение

1203

1204

1205

1206

1207

1208

1209

120A

120B

Значение

FF

FF

60

45

00

00

00

00

00

ESP

pop edx

Смещение

1203

1204

1205

1206

1207

1208

1209

120A

120B

Значение

FF

FF

60

45

00

00

00

00

00

ESP

edx теперь 4560FFFFh.

Вызов подпрограмм возврат из них - CALL, RET. Команда call передает управление ближней или дальней процедуре с запоминанием в стеке адреса точки возврата. Команда ret возвращает управление из процедуры вызывающей программе, адрес возврата получает из стека. Пример:

..code..

call 0455659

..more code..

Код с адреса 455659:

add eax, 500

mul eax, edx

ret

Когда выполняется команда call, процессор передает управление на код с адреса 455659, и выполняет его до команды ret, а затем возвращает управление команде следующей за call. Код который вызывается командой call называется процедурой. Вы можете поместить код, который вы часто используете в процедуру и каждый раз когда он вам нужен вызывать его командой call.

Подробнее: команда call помещает регистр EIP (указатель на следующюю команду, которая должна быть выполнена) в стек, а команда ret извлекает его и передаёт управление этому адресу. Вы также можете определить аргументы, для вызываемой программы (процедуры). Это можно сделать через стек:

push значение_1 push значение_2 call procedure

Одно важное замечание: