Форум: "Прочее";
Текущий архив: 2008.10.19;
Скачать: [xml.tar.bz2];
ВнизФокус на АСМе в Дельфи Найти похожие ветки
← →
Bob (2008-08-27 09:31) [0]Здравствуйте все. Вот нашел в нете интересный фокус:
вставка в Дельфи
procedure Focus;
asm
mov ax,$04EB
@as: jmp @as-2 ; <= переход на EB04 (а это уже переход на ret)
end;
Вроде все ясно, но программа зацикливается на команде jmp @as-2.
Подскажите, пожалуйста, в чем дело.(W2k,WXP, D7)
Окошко CPU выглядит так :
004520E8 66B8EB04 mov ax,$04eb
004520EC EBFE jmp -$02
004520EE C3 ret
Заранее благодарю.
← →
Сергей М. © (2008-08-27 09:41) [1]
> программа зацикливается на команде jmp @as-2
И правильно зацикливается.
А почему бы ей не зацикливаться ?
004520EE - 2 = 004520EC
← →
Rouse_ © (2008-08-27 09:46) [2]
> программа зацикливается на команде jmp @as-2.
BASM не кушает инструкции такого плана как jmp @as-2
можешь поэксперементировать @as-4/@as-6/@as-8
перепеши вот так:procedure Focus;
asm
mov ax,$04EB
@as: db $eb, $fb
end;
← →
Bob (2008-08-27 09:51) [3]>004520EE - 2
Разве отсчет идет от адреса следующей команды а не от своего ?
А куда тогда попадем по команде EB04 ?
← →
Сергей М. © (2008-08-27 09:51) [4]
> Rouse_ © (27.08.08 09:46) [2]
Эт почему же ?
Кушает и не давится)
← →
Сергей М. © (2008-08-27 09:52) [5]
> Разве отсчет идет от адреса следующей команды а не от своего
> ?
Угу.
Причем еще со времен царя Гороха.
> куда тогда попадем по команде EB04 ?
А где она у тебя ?
← →
Rouse_ © (2008-08-27 09:53) [6]
> Эт почему же ?
> Кушает и не давится)
У меня адрес джампа остается не изменный, т.е. прыжок всегда на адрес метки поправка не учитывается от адреса.
А автор же хочет взять оффсет в 2 байта с метки чтобы попасть на $04EB что будет означать jmp $4 и перепрыгнуть на ret. Впрочем кому я рассказываю - ты и лучше меня знаешь :)
← →
Bob (2008-08-27 09:54) [7]>Rouse_ © [2]
А так заработало !
Спасибо!
← →
Сергей М. © (2008-08-27 09:56) [8]А, ты вон о чем..
Я подумал, что "не кушает" = "не компилируется"
← →
Bob (2008-08-27 10:02) [9]>Сергей М. © [5]
А я на АСМе не работал уже "со времен царя Гороха" - все потихоньку забывается (к сожалению)
Еще раз всем Спасибо .
← →
Игорь Шевченко © (2008-08-27 10:21) [10]а фокус-то в чем ?
← →
Сергей М. © (2008-08-27 10:23) [11]
> фокус-то в чем ?
Видимо, в неудачной попытке запутать вражескую разведку)
← →
Bob (2008-08-27 10:53) [12]>Игорь Шевченко © [10]
Сергей М. © [11] угадал. Хотя для меня это "просто интересно".
>Rouse_ © [2]
Прошу прощения, но что-то я никак не в"еду : почему "-5"($FB), от какого
адреса отсчитывать?
← →
Игорь Шевченко © (2008-08-27 10:59) [13]
> Прошу прощения, но что-то я никак не в"еду : почему "-5"($FB),
> от какого
> адреса отсчитывать?
адрес перехода всегда отсчитывается от адреса команды jump + длина команды jump
← →
Сергей М. © (2008-08-27 11:11) [14]
> от какого
> адреса отсчитывать?
Как и всегда - от адреса инструкции, следующей за инструкцией перехода.
Вот "правильный фокус":
procedure Focus;
asm
mov ax,$02EB
@as: db $eb, $fc
end;
← →
Bob (2008-08-27 11:15) [15]>Игорь Шевченко © (27.08.08 10:59) [13]
>от адреса команды jump + длина команды jump
что-то не получается
004520E8 66B8EB04 mov ax,$04eb
004520EC EBFB jmp -$05
004520EE C3 ret
4520EC+2=4520EE
4520EE-5=4520E9 - попадаем на B8 а не на EB04
← →
Сергей М. © (2008-08-27 11:25) [16]
> Bob (27.08.08 11:15) [15]
Операнд $04EB лежит по адресу 004520EA
Когда он станет инструкцией jmp +4, переход произойдет черт те куда, но только не на 004520EE, потому что 004520EC + 4 = 004520D0.
Соответственно чтобы сначала попасть в точку 004520EA, нужно из 004520EE вычесть 004520EA - это и будет смещение, т.е. jmp -4
← →
Bob (2008-08-27 11:42) [17]>Сергей М. © (27.08.08 11:11) [14]
>"правильный фокус":
asm
mov ax,$02EB
@as: db $eb, $fc
end;
- Дошло. Спасибо.
Однако вариант Rouse_ © (27.08.08 09:46) [2] тоже почему-то работает!
Еще раз Спасибо.
← →
Сергей М. © (2008-08-27 11:48) [18]
> [2] тоже почему-то работает!
Просто повезло, что в точке перехода оказалась безобидная инструкция mov eax, следом за которой идет ret
← →
Bob (2008-08-27 11:57) [19]>Сергей М. © (27.08.08 11:48) [18]
>Просто повезло, ...
- я тоже так думаю.
Ладно. Еще раз спасибо.
Всех благ.
← →
Renegat © (2008-08-27 13:36) [20]Чёрт, опоздал =(
Вот всегда так %)
(с) Громозека
← →
Bob (2008-08-27 13:49) [21]>Renegat © (27.08.08 13:36) [20]
>Чёрт, опоздал =(
- Не переживай!
Хочешь я и тебе задам вопрос примерно из той же оперы?
← →
Renegat © (2008-08-27 14:41) [22]хм... ну задавайте. В общем-то я и не переживал.
это так, очередной бред шумашетшего был)
← →
Германн © (2008-08-27 14:41) [23]
> адрес перехода всегда отсчитывается от адреса команды jump
> + длина команды jump
Странно. А в ассемблере для 8051 (ассемблер тоже интеловский) от адреса самой команды.
← →
Сергей М. © (2008-08-27 14:58) [24]
> Германн © (27.08.08 14:41) [23]
> в ассемблере для 8051
Ассемблер-то причем ?
Дело же в конкретном процессоре или семействе процессоров, для каждого имеется свой ассемблер, учитывающий индивидуальные особенности процессора.
В семействе x86 Интел решил так, а в 8051 иначе, ничего странного.
← →
Bob (2008-08-27 15:25) [25]>Renegat © (27.08.08 14:41) [22]
- пока туда-сюда уже сам сообразил.
а идейка не моя. Вот если интересует:
Автор: Bad_guy
Есть некая процедура SecretProc.
А вызывается она не "напрямую", а вот так:
.....
Mov eax, regprocaddr
Call eax
.....
Где: regprocaddr содержит адрес той самой процедуры. Получить его просто. Можно сохранить, а след. раз ввести вместо пароля.
P.S. Не то чтобы мне это надо - просто интересно было.
Спасибо за отклик.
← →
Сергей М. © (2008-08-27 16:39) [26]
> Bob (27.08.08 15:25) [25]
А в чем собссно вопрос ?
> Не то чтобы мне это надо - просто интересно было
Ну ведь темнишь !
Давай уже колись про свои "дела темные") ..
Не убъем тебя за оные .. по кр.мере сразу .. Обещаю) ..
← →
Германн © (2008-08-28 01:25) [27]
> Сергей М. © (27.08.08 14:58) [24]
>
>
> > Германн © (27.08.08 14:41) [23]
>
>
> > в ассемблере для 8051
>
>
> Ассемблер-то причем ?
> Дело же в конкретном процессоре или семействе процессоров,
> для каждого имеется свой ассемблер, учитывающий индивидуальные
> особенности процессора.
>
> В семействе x86 Интел решил так, а в 8051 иначе, ничего
> странного.
>
Эт конечно так. Но интелловский ассемблер для семейства 8051 сохранил много чего от ассемблера для семейства 8088. Что мне и помогло легко его освоить. А вот эту особенность заметил только сейчас.
← →
Bob (2008-08-28 06:59) [28]>Сергей М. © (27.08.08 16:39) [26]
>"А в чем собссно вопрос ?"
- БЫЛ в том, что если удалить из программы блок определения адреса
то после перекомпиляции адрес процедуры меняется. Вот сначала
и не сообразил как быть.
>"колись "
- "ей богу"
сейчас работа напрямую с программированием почти не связана -
так, мелочевка всякая. Вот руки и чешутся по чему-
нибуть "вкусненькому"... (а может и пригодится).
А насчет адресации : последние годы работал на PIC16xxx - там как 8051
вот и перепутал...
← →
Сергей М. © (2008-08-28 09:18) [29]
> после перекомпиляции адрес процедуры меняется
Вовсе не факт.
Это напрямую зависит от изменений, которые были сделаны в тексте программы.
← →
Bob (2008-08-28 13:12) [30]>Сергей М. © (28.08.08 09:18) [29]
>"Это напрямую зависит от изменений, которые были сделаны в тексте программы."
- Совершенно согласен. Поэтому и задумался : а нельзя ли как-то положить
процедуру в такое место, чтобы ее адрес не менялся, например, при
замене операторов записи адреса в файл на операторы считывания
его Из файла ? Ничего не придумал ;-(
Сделал так : оставил и запись и чтение, но по условию в глоб. переменной
Так что изменения минимальны и никаких сдвигов не наблюдается.
Неинтересно получилось.
А может правда есть какой-нибудь способ "закрепить" процедуру так,
чтобы никакие изменения в тексте программы не перемещали ее в памяти?
Или выдрать ее адрес из готового экзешника (без помощи отладчиков)?
Чисто из спортивного интереса.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.10.19;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c