Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1220944122
K12
2008-09-09 11:08
2008.10.19
Запрос


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


15-1219907118
tesseract
2008-08-28 11:05
2008.10.19
Чего-то все про Абрамова забыли


2-1221226569
webpauk
2008-09-12 17:36
2008.10.19
PanelResize


2-1220944731
Кирей
2008-09-09 11:18
2008.10.19
ошибка при работе с экселем OLE error 800A03EC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский