Сейчас на форуме: vsv1 (+3 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Фокусы с адресацией?( |
Посл.ответ | Сообщение |
|
Создано: 12 марта 2008 17:54 · Поправил: Welemir · Личное сообщение · #1 Start: mov eax, l1 mov ebx, l2 mov ecx, l3 push ecx push ebx push eax call proc1 add esp,12 ret Proc1 Proc push ebp mov ebp, esp sub esp,8 mov eax, dword ptr [ebp+8] mov dword ptr [ebp-4], eax mov eax, dword ptr [ebp+12] mov dword ptr [ebp-8], eax mov eax, dword ptr [ebp+16] add eax, dword ptr [ebp-4] add eax, dword ptr [ebp-8] leave ret proc1 endp text ends end start Прошу объяснить *фишку* с адресацией, после sub esp, 8. Сначала вроде понятно, что в регистры заносятся три переменные, потом в стек заносятся регистры, ток наоборот (правило такое кажись:Р). Потом вызывается процедура, и после неё сразу же указатель стека уменьшается на 12, затем происходит возврат из процедуры. Затем происходит опять вызов процедуры(?),и дальше пошла сохранения указателя стека в регистре ebp.Потом,судя по вышеизложенному, происходит очистка указателя стека путём вычитания из него 8(почему именно восемь непонятно,или забыл уже...).А вот дальше непонятно вааапще)).Ясное дело, что это базовый режим адресации,где база указана в скобках,а почему именно такие числа выбираются нипонятно(то +8 то -16).В учебнике описания не нашёл подробного(там коротко об режимах адресации было изложено). Прошу вот, подсобить...:РР P.S. Да и вот ещё что, если я где ошибся, описывая программу,поправьте пожалста(это оч важно для меня) )))). ![]() |
|
Создано: 12 марта 2008 18:23 · Личное сообщение · #2 нету здесь особой "фишки" - стандартное выделение места в стеке под переданные переменные процедуре и ее локальные переменные. [ebp + чтото] - доступ к параметрам процедуры (которые забиты в стек push'ами перед call) +8 потому что в стеке еще лежат "старый" ebp (+0) и адрес возврата из процедуры (+4). [ebp - чтото] - доступ к локальным переменным процедуры (место под которые выделено вычитанием из esp) в учебниках это обычно описывается при разжевывании команд enter и leave ![]() |
|
Создано: 12 марта 2008 19:07 · Личное сообщение · #3 |
|
Создано: 12 марта 2008 19:20 · Личное сообщение · #4 |
|
Создано: 12 марта 2008 19:57 · Личное сообщение · #5 |
|
Создано: 12 марта 2008 20:04 · Личное сообщение · #6 Да и вот вопрос ещё лично к тебе,запарился искать)))).Ты знаешь,как сохранить все вектора перед загрузкой ?. Пишут что команда Vecs s, а там такой и в помине нет:РР,потом какие-то команды snap_ save и snap_compare. Первая сохраняет регион памяти какой-то, а вторая- его сравнивает с другим.А где они без понятия,команды эти( ![]() |
|
Создано: 12 марта 2008 20:47 · Личное сообщение · #7 Welemir пишет: Да и вот вопрос ещё лично к тебе,запарился искать)))).Ты знаешь,как сохранить все вектора перед загрузкой ?. Пишут что команда Vecs s, а там такой и в помине нет:РР,потом какие-то команды snap_ save и snap_compare. Первая сохраняет регион памяти какой-то, а вторая- его сравнивает с другим.А где они без понятия,команды эти( ![]() главное с адресацией всё понятно (?). Welemir пишет: Угу, add eax, dword ptr [ebp-4] add eax, dword ptr [ebp-8] функция должна что то полезное сделать - вот она и делает. ![]() |
|
Создано: 13 марта 2008 09:53 · Личное сообщение · #8 Welemir пишет: Vecs s, а там такой и в помине нет:РР,потом какие-то команды snap_ save и snap_compare. CRACKL@B ::: справочники Ассемблер, Delphi, WinAPI Soft-ICE сохраняет векторы прерываний, когда он загружается, когда LDR.EXE загружает программа и когда используется команда VECS S. VECS -- Сохранение/восстановление/сравнение векторов прерываний SNAP -- Запоминает содержимое блока памяти (snap shot) ![]() |
|
Создано: 13 марта 2008 22:22 · Поправил: Модератор · Личное сообщение · #9 |
![]() |
eXeL@B —› Вопросы новичков —› Фокусы с адресацией?( |