Коды условных и безусловных переходов у меня неправильные.

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 18 сен 2010.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Почему?
    Друзья! Решил разобраться с кодами условных и безусловных переходов и сразу же столкнуля с несоответствием того, что у меня на компе и того, что написано. Вот, например переход jmp

    Вот http://www.realcoding.net/article/view/1768 читаем:

    Код (Text):
    1. Прямой ближний (near), или внутрисегментный переход. Этот переход отличается от
    2. предыдущего только тем, что под смещение к точке перехода отводится целое слово. Это дает
    3. возможность осуществить переход в любую точку 64-кбайтного сегмента.
    4.  
    5. code segment
    6. jmp go ;Код Е9 dddd
    7. go:
    8. code ends
    НО как я не изголялся с OllyDbg, как только не прописывал там прыжки БОЛЕЕ чем на 128 байт, везде получал такое

    Код (Text):
    1. Е9 CA FE BA BE
    То есть e9 + 4 байта а не два, как написано по ссылке.
    .........................................................................................
    Далее читаем, как написано по ссылке:
    Код (Text):
    1. Прямой дальний (far), или межсегментный переход. Этот переход позволяет передать
    2. управление в любую точку любого сегмента. При этом, очевидно, предполагается, что программный
    3. комплекс включает несколько сегментов команд. Команда дальнего перехода имеет длину 5 байт и
    4. включает, кроме кода операции EAh, еще и полный адрес точки перехода, т.е. сегментный адрес и
    5. смещение. Транслятору надо сообщить, что этот переход - дальний (по умолчанию команда jmp
    6. транслируется, как команда ближнего перехода). Это делается с помощью описателя far ptr,
    7. указываемого перед именем точки перехода.
    8.  
    9.  
    10. codel segment
    11. assume CS: codel ;Сообщим транслятору, что это сегмент команд
    12. jmp far ptr go ;Код EA dddd ssss
    13. codel ends
    14. code2 segment
    15. assume CS : code2 ; Сообщим транслятору, что это сегмент команд
    16. gо:
    17. code2 ends
    18.  
    19. Метка go находится в другом сегменте команд этой двухсегментной программы.
    ...А пытаясь увидеть воочию это пример, я никак не мог реализовать у себя чтобы было
    ЕA CA FE BA BE. У меня всегда именно Е9 CA FE BA BE

    Ну то есть я брал OllyDbg, запихивал туда программу и пытался прыжки всякие прописать. И они не сответстововали. Ну и ещё много вопросов. У меня WIN XP, 32 регистра


    Чё я делал не так? Спасибо
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    1. вместо OllyDbg лучше использовать компилятор
    2. под OllyDbg у тебя программа для Windows. Со всеми вытекающими: плоская модель памяти, 32-битное окружение. Поэтому межсегментный переход Olly не скомпилирует - ты сначала найди другой сегмент ;)
    И поэтому переходы внутри сегмента используют 4 байта адреса, а не 2. То, что ты цитируешь, написано о 16-битном коде, поэтому там и сегменты есть, и адреса в 2 байта. Возьми debug.exe - будет тебе и то и другое.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    ОК, я предполагал, что эта инфа устарела. Собсно, я собираюсь только с такими прогами и работать: плоская (несегментная, как я понимаю) модель памяти и никаких 16-ти разрядных регистров, только 32.
    Так что поищу я другие ссылки. Спасибо.

    А компилятор-то зачем?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    пишешь все интересующие команды в пробную программу, а потом уже смотришь отладчиком во что они скомпилились, тогда точно не будешь спотыкаться об такие нюансы.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Спасибо