Почему? Друзья! Решил разобраться с кодами условных и безусловных переходов и сразу же столкнуля с несоответствием того, что у меня на компе и того, что написано. Вот, например переход jmp Вот http://www.realcoding.net/article/view/1768 читаем: Код (Text): Прямой ближний (near), или внутрисегментный переход. Этот переход отличается от предыдущего только тем, что под смещение к точке перехода отводится целое слово. Это дает возможность осуществить переход в любую точку 64-кбайтного сегмента. code segment … jmp go ;Код Е9 dddd … go: … code ends НО как я не изголялся с OllyDbg, как только не прописывал там прыжки БОЛЕЕ чем на 128 байт, везде получал такое Код (Text): Е9 CA FE BA BE То есть e9 + 4 байта а не два, как написано по ссылке. ......................................................................................... Далее читаем, как написано по ссылке: Код (Text): Прямой дальний (far), или межсегментный переход. Этот переход позволяет передать управление в любую точку любого сегмента. При этом, очевидно, предполагается, что программный комплекс включает несколько сегментов команд. Команда дальнего перехода имеет длину 5 байт и включает, кроме кода операции EAh, еще и полный адрес точки перехода, т.е. сегментный адрес и смещение. Транслятору надо сообщить, что этот переход - дальний (по умолчанию команда jmp транслируется, как команда ближнего перехода). Это делается с помощью описателя far ptr, указываемого перед именем точки перехода. codel segment assume CS: codel ;Сообщим транслятору, что это сегмент команд … jmp far ptr go ;Код EA dddd ssss … codel ends code2 segment assume CS : code2 ; Сообщим транслятору, что это сегмент команд … gо: … code2 ends Метка go находится в другом сегменте команд этой двухсегментной программы. ...А пытаясь увидеть воочию это пример, я никак не мог реализовать у себя чтобы было ЕA CA FE BA BE. У меня всегда именно Е9 CA FE BA BE Ну то есть я брал OllyDbg, запихивал туда программу и пытался прыжки всякие прописать. И они не сответстововали. Ну и ещё много вопросов. У меня WIN XP, 32 регистра Чё я делал не так? Спасибо
1. вместо OllyDbg лучше использовать компилятор 2. под OllyDbg у тебя программа для Windows. Со всеми вытекающими: плоская модель памяти, 32-битное окружение. Поэтому межсегментный переход Olly не скомпилирует - ты сначала найди другой сегмент И поэтому переходы внутри сегмента используют 4 байта адреса, а не 2. То, что ты цитируешь, написано о 16-битном коде, поэтому там и сегменты есть, и адреса в 2 байта. Возьми debug.exe - будет тебе и то и другое.
ОК, я предполагал, что эта инфа устарела. Собсно, я собираюсь только с такими прогами и работать: плоская (несегментная, как я понимаю) модель памяти и никаких 16-ти разрядных регистров, только 32. Так что поищу я другие ссылки. Спасибо. А компилятор-то зачем?
пишешь все интересующие команды в пробную программу, а потом уже смотришь отладчиком во что они скомпилились, тогда точно не будешь спотыкаться об такие нюансы.