-
Здравствуйте все. Вот нашел в нете интересный фокус:
вставка в Дельфи
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
Заранее благодарю.
-
> программа зацикливается на команде jmp @as-2
И правильно зацикливается.
А почему бы ей не зацикливаться ?
004520EE - 2 = 004520EC
-
> программа зацикливается на команде jmp @as-2.
BASM не кушает инструкции такого плана как jmp @as-2
можешь поэксперементировать @as-4/@as-6/@as-8
перепеши вот так:
procedure Focus;
asm
mov ax,$04EB
@as: db $eb, $fb
end;
-
>004520EE - 2
Разве отсчет идет от адреса следующей команды а не от своего ?
А куда тогда попадем по команде EB04 ?
-
> Rouse_ © (27.08.08 09:46) [2]
Эт почему же ?
Кушает и не давится)
-
> Разве отсчет идет от адреса следующей команды а не от своего
> ?
Угу.
Причем еще со времен царя Гороха.
> куда тогда попадем по команде EB04 ?
А где она у тебя ?
-
> Эт почему же ?
> Кушает и не давится)
У меня адрес джампа остается не изменный, т.е. прыжок всегда на адрес метки поправка не учитывается от адреса.
А автор же хочет взять оффсет в 2 байта с метки чтобы попасть на $04EB что будет означать jmp $4 и перепрыгнуть на ret. Впрочем кому я рассказываю - ты и лучше меня знаешь :)
-
>Rouse_ © [2]
А так заработало !
Спасибо!
-
А, ты вон о чем..
Я подумал, что "не кушает" = "не компилируется"
-
>Сергей М. © [5]
А я на АСМе не работал уже "со времен царя Гороха" - все потихоньку забывается (к сожалению)
Еще раз всем Спасибо .
-
а фокус-то в чем ?
-
> фокус-то в чем ?
Видимо, в неудачной попытке запутать вражескую разведку)
-
>Игорь Шевченко © [10]
Сергей М. © [11] угадал. Хотя для меня это "просто интересно".
>Rouse_ © [2]
Прошу прощения, но что-то я никак не в'еду : почему "-5"($FB), от какого
адреса отсчитывать?
-
> Прошу прощения, но что-то я никак не в'еду : почему "-5"($FB),
> от какого
> адреса отсчитывать?
адрес перехода всегда отсчитывается от адреса команды jump + длина команды jump
-
> от какого
> адреса отсчитывать?
Как и всегда - от адреса инструкции, следующей за инструкцией перехода.
Вот "правильный фокус":
procedure Focus;
asm
mov ax,$02EB
@as: db $eb, $fc
end;
-
>Игорь Шевченко © (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
-
> Bob (27.08.08 11:15) [15]
Операнд $04EB лежит по адресу 004520EA
Когда он станет инструкцией jmp +4, переход произойдет черт те куда, но только не на 004520EE, потому что 004520EC + 4 = 004520D0.
Соответственно чтобы сначала попасть в точку 004520EA, нужно из 004520EE вычесть 004520EA - это и будет смещение, т.е. jmp -4
-
>Сергей М. © (27.08.08 11:11) [14]
>"правильный фокус":
asm
mov ax,$02EB
@as: db $eb, $fc
end;
- Дошло. Спасибо.
Однако вариант Rouse_ © (27.08.08 09:46) [2] тоже почему-то работает!
Еще раз Спасибо.
-
> [2] тоже почему-то работает!
Просто повезло, что в точке перехода оказалась безобидная инструкция mov eax, следом за которой идет ret
-
>Сергей М. © (27.08.08 11:48) [18]
>Просто повезло, ...
- я тоже так думаю.
Ладно. Еще раз спасибо.
Всех благ.
-
Чёрт, опоздал =(
Вот всегда так %)
(с) Громозека
-
>Renegat © (27.08.08 13:36) [20]
>Чёрт, опоздал =(
- Не переживай!
Хочешь я и тебе задам вопрос примерно из той же оперы?
-
хм... ну задавайте. В общем-то я и не переживал.
это так, очередной бред шумашетшего был)
-
> адрес перехода всегда отсчитывается от адреса команды jump
> + длина команды jump
Странно. А в ассемблере для 8051 (ассемблер тоже интеловский) от адреса самой команды.
-
> Германн © (27.08.08 14:41) [23]
> в ассемблере для 8051
Ассемблер-то причем ?
Дело же в конкретном процессоре или семействе процессоров, для каждого имеется свой ассемблер, учитывающий индивидуальные особенности процессора.
В семействе x86 Интел решил так, а в 8051 иначе, ничего странного.
-
>Renegat © (27.08.08 14:41) [22]
- пока туда-сюда уже сам сообразил.
а идейка не моя. Вот если интересует:
Автор: Bad_guy
Есть некая процедура SecretProc.
А вызывается она не "напрямую", а вот так:
.....
Mov eax, regprocaddr
Call eax
.....
Где: regprocaddr содержит адрес той самой процедуры. Получить его просто. Можно сохранить, а след. раз ввести вместо пароля.
P.S. Не то чтобы мне это надо - просто интересно было.
Спасибо за отклик.