Смотрю книгу Юрова. Там есть команда 0E9h. Пиша сам команду db 0E9h dd $+3 Но OllyDebugger расценивает это как данные. Может команду не так записываю. Заранее благодарен.
bogrus Вот видишь, что может сделать нечеткая формулировка вопроса )) Уже двоих заклинило )))))))))))
Ну , олли видимо не декодирует потому как дистанция слишком большая ($+3) , да а там память not readable , лучше пробывать сначала dd 1 (прыгнуть вперёд через 1 байт) , dd 3 (через 3 байта) . А то сразу где-то получаеться через 00401003h байт
0E9h как раз и есть относительный безусловный jmp, после этого байта идёт четырёхбайтовое смещение относительно адреса следующей за jmp команды. 0EBh такой же, только короткий(смещение 1 байт). А абсолютный существует только в форме jmp eax или jmp addr, где addr - адрес, по которому распологается адрес, куда надо прыгнуть.
0E9h как раз и есть относительный безусловный jmp, после этого байта идёт четырёхбайтовое смещение дву байтовое! Код (Text): -a 0B0A:0100 db e9 0B0A:0101 dw 00 0B0A:0103 dw 1111 0B0A:0105 -u 100 0B0A:0100 E90000 JMP 0103 0B0A:0103 1111 ADC [BX+DI],DX это после EA(абсолютный far jmp seg:offset) - четырёх байтовое Код (Text): -a 100 0B0A:0100 db ea 0B0A:0101 dw 0000 0B0A:0103 dw 1111 0B0A:0105 -u 100 0B0A:0100 EA00001111 JMP 1111:0000 Посмотри второй том Интела там очень хорошо про опкоды написано(лучше чем там я ни где не видел)
2 dragon безусловный jmp? - больше так пожалуста не говори - у людей будет клинить мозги - jmp ВСЕГДА безусловный! - условные бывают переходы jz,jnz и т.д.
я сейчас проверил jmp short label1 ... ;some code .. label1 транслируется как db 0EBh db offset ;===================== это jmp label1 ... ;some code .. label1 транслируется как db 0E9h dw offset
Да, может и двухбайтовое, а скажем в 64bit режиме оно восьмибайтовое. Оно равно размеру разрядности в байтах. А в jmp short оно всегда однобайтовое.
dragon - а скажем в 64bit режиме оно восьмибайтовое. Оно равно размеру разрядности в байтах. А в jmp short оно всегда однобайтовое. в таком случае наверно оно должно предворятся перфиксом смены размеров операндов по умолчанию - что то типа 66h db перфикс db 0E9h ...
Same Если не применять префиксы, то инструкция 0E9h имеет аргумент размером : 1. 32-бита (4 байта), если кодовый сегмент имеет 32-битную или 64-битную адресацию. 2. 16-бит (2 байта), если кодовый сегмент имеет 16-битную адресацию. Поаккуратнее будьте.
2 ScepticWyvern - в любом случае писать код в ручную там где нужно вычислять смещение - это мутроно - лучше это дело доверить компилятору - тем более он учитывает разрядность кода -------------------------- P.S предположение про перфикс для команды 0E9h было ошибочным - ничего такого в документации от интела нет - перфиксы имеют только команды работы с регистрами mov,add и т.д.
Evg666 Почитай Юрова внимательно. Там команда jmp $+3 Она должна быть записана, как db 0E9h dd 3 т.к. это относительный безусловный jump
Same Периодически нужно писать код вручную. Вот помню, в DOS-овые времена, когда мы перехватывали прерывания, то писали адрес предыдущего обработчика именно так Код (Text): db 0EAh ph_seg : dw 0 ph_off : dw 0 А насчет префикса 66h для 0E9h ты сейчас неправ. Префикс размера операнда может использоваться с near jmp, call. Это,например, значит, что в 32-битном кодовом сегменте мы используем 16 байт для указания смещения, а не 32.
2 ScepticWyvern Периодически нужно писать код вручную. Вот помню, в DOS-овые времена, когда мы перехватывали прерывания, то писали адрес предыдущего обработчика именно так db 0EAh ph_seg : dw 0 ph_off : dw 0 по мне всегда было лучше push 0000h push 0000h retf