Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.19;
Скачать: CL | DM;

Вниз

Фокус на АСМе в Дельфи   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.019 c
6-1194543781
Indder
2007-11-08 20:43
2008.10.19
Indy telnet


15-1220026293
XentaAbsenta
2008-08-29 20:11
2008.10.19
Ветка - "Проектирование"


15-1220135516
Eraser
2008-08-31 02:31
2008.10.19
Системный микшер и виста + Delphi


2-1221222546
savyhinst
2008-09-12 16:29
2008.10.19
Про DLL


2-1221401730
Виталион
2008-09-14 18:15
2008.10.19
Запустить приложение и считать информацию