стек здесь заполнен нулями, но
Смещение |
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 возвращает управление из процедуры вызывающей программе. Пример:
..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
Внутри процедуры, аргументы могут быть прочитаны из стека и использованы. Локальные переменные, т.е. данные, которые необходимы только внутри процедуры, также могут быть сохранены в стеке. Я не буду подробно рассказывать об этом, потому, что это может быть легко сделано в ассемблерах MASM и TASM. Просто запомните, что вы можете делать процедуры и что они могут использовать параметры.
Одно важное замечание:
регистр eax почти всегда используется для хранения результата процедуры.
Это также приминимо к функциям windows. Конечно вы можете использовать любой другой регистр в ваших собственных процедурах, но это стандарт.
[наверх]
Содержание Назад
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий