А бывает относительный безусловный jmp?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Evg666, 23 сен 2004.

  1. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    Смотрю книгу Юрова. Там есть команда 0E9h. Пиша сам команду

    db 0E9h

    dd $+3

    Но OllyDebugger расценивает это как данные. Может команду не так записываю. Заранее благодарен.
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Что-то меня заклинило... Уже с минуту пытаюсь понять - что такое "относительный jmp"...
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Это наверное противоположный абсолютному (дистанция а не адрес), я вот думаю бывает ли условный jmp :)
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    bogrus



    Вот видишь, что может сделать нечеткая формулировка вопроса :))) Уже двоих заклинило :))))))))))))
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну :) , олли видимо не декодирует потому как дистанция слишком большая ($+3) , да а там память not readable , лучше пробывать сначала dd 1 (прыгнуть вперёд через 1 байт) , dd 3 (через 3 байта) .

    А то сразу где-то получаеться через 00401003h байт :)
     
  6. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    0E9h как раз и есть относительный безусловный jmp, после этого байта идёт четырёхбайтовое смещение относительно адреса следующей за jmp команды. 0EBh такой же, только короткий(смещение 1 байт). А абсолютный существует только в форме jmp eax или jmp addr, где addr - адрес, по которому распологается адрес, куда надо прыгнуть.
     
  7. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    0E9h как раз и есть относительный безусловный jmp, после этого байта идёт четырёхбайтовое смещение

    дву байтовое!
    Код (Text):
    1. -a
    2. 0B0A:0100 db e9
    3. 0B0A:0101 dw 00
    4. 0B0A:0103 dw 1111
    5. 0B0A:0105
    6. -u 100
    7. 0B0A:0100 E90000        JMP     0103
    8. 0B0A:0103 1111          ADC     [BX+DI],DX




    это после EA(абсолютный far jmp seg:offset) - четырёх байтовое


    Код (Text):
    1. -a 100
    2. 0B0A:0100 db ea
    3. 0B0A:0101 dw 0000
    4. 0B0A:0103 dw 1111
    5. 0B0A:0105
    6. -u 100
    7. 0B0A:0100 EA00001111    JMP     1111:0000


    Посмотри второй том Интела там очень хорошо про опкоды написано(лучше чем там я ни где не видел:))
     
  8. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 dragon

    безусловный jmp? - больше так пожалуста не говори - у людей будет клинить мозги - jmp ВСЕГДА безусловный! - условные бывают переходы jz,jnz и т.д.
     
  9. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    я сейчас проверил

    jmp short label1

    ...

    ;some code

    ..

    label1

    транслируется как

    db 0EBh

    db offset

    ;=====================

    это

    jmp label1

    ...

    ;some code

    ..

    label1

    транслируется как

    db 0E9h

    dw offset
     
  10. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер




    Да, может и двухбайтовое, а скажем в 64bit режиме оно восьмибайтовое. Оно равно размеру разрядности в байтах. А в jmp short оно всегда однобайтовое.
     
  11. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    dragon -

    а скажем в 64bit режиме оно восьмибайтовое. Оно равно размеру разрядности в байтах. А в jmp short оно всегда однобайтовое.

    в таком случае наверно оно должно предворятся перфиксом смены размеров операндов по умолчанию - что то типа 66h

    db перфикс

    db 0E9h

    ...
     
  12. ScepticWyvern

    ScepticWyvern New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2004
    Сообщения:
    5
    Адрес:
    Russia
    Same

    Если не применять префиксы, то инструкция 0E9h имеет аргумент размером :

    1. 32-бита (4 байта), если кодовый сегмент имеет 32-битную или 64-битную адресацию.

    2. 16-бит (2 байта), если кодовый сегмент имеет 16-битную адресацию.



    Поаккуратнее будьте.
     
  13. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 ScepticWyvern -

    в любом случае писать код в ручную там где нужно вычислять смещение - это мутроно - лучше это дело доверить компилятору - тем более он учитывает разрядность кода

    --------------------------

    P.S предположение про перфикс для команды 0E9h было ошибочным - ничего такого в документации от интела нет - перфиксы имеют только команды работы с регистрами mov,add и т.д.
     
  14. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Evg666



    Почитай Юрова внимательно. Там команда jmp $+3

    Она должна быть записана, как

    db 0E9h

    dd 3


    т.к. это относительный безусловный jump
     
  15. ScepticWyvern

    ScepticWyvern New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2004
    Сообщения:
    5
    Адрес:
    Russia
    Same

    Периодически нужно писать код вручную. Вот помню, в DOS-овые времена, когда мы перехватывали прерывания, то писали адрес предыдущего обработчика именно так
    Код (Text):
    1.  
    2. db 0EAh
    3. ph_seg : dw 0
    4. ph_off : dw 0
    5.  


    А насчет префикса 66h для 0E9h ты сейчас неправ. Префикс размера операнда может использоваться с near jmp, call. Это,например, значит, что в 32-битном кодовом сегменте мы используем 16 байт для указания смещения, а не 32.
     
  16. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    OllyDebuger тупит с командой E9h c большим числом
     
  17. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    Извините за формулировку.
     
  18. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    Извините за формулировку.
     
  19. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 ScepticWyvern

    Периодически нужно писать код вручную. Вот помню, в DOS-овые времена, когда мы перехватывали прерывания, то писали адрес предыдущего обработчика именно так

    db 0EAh

    ph_seg : dw 0

    ph_off : dw 0




    по мне всегда было лучше

    push 0000h

    push 0000h

    retf