неперемещаемые команды с относительной адресацией

Тема в разделе "WASM.WIN32", создана пользователем 63F45EF45RB65R6VR, 13 ноя 2011.

  1. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    после копирования кода в трамплин надо пофиксить относительные адреса но некотрые нельзя даже с фиксацией пемещать вот тут список
    Код (Text):
    1. это вариации LOOP'
    2. E2 cb LOOP rel8 Decrement count; jump short if count ¹ 0
    3. E1 cb LOOPE rel8 Decrement count; jump short if count ¹ 0 and ZF=1
    4. E1 cb LOOPZ rel8 Decrement count; jump short if count ¹ 0 and ZF=1
    5. E0 cb LOOPNE rel8 Decrement count; jump short if count ¹ 0 and ZF=0
    6. E0 cb LOOPNZ rel8 Decrement count; jump short if count ¹ 0 and ZF=0
    вот эти вроде тоже
    Код (Text):
    1. E3 cb JCXZ rel8 Jump short if CX register is 0
    2. E3 cb JECXZ rel8 Jump short if ECX register is 0
    а какие еще есть ?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не совсем понятно, почему их нельзя перемещать? Их как раз можно перемещать, т.к. rel8 расширяется со знаком до размера rIP и прибавляется к rIP.
     
  3. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    условимся что мы говорим о x32
    вот например как оторвать эту инструкцию и перместить в трамплин
    loop metka
    она ведь всего -128 + 127 байт поддерживает прыжки а переместить надо намного дальше
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А, в этом смысле. Ну, это код перестраивать надо, и тут многое от обстоятельств зависит.

    А насчет инструкций:

    jmp short: 0xEB
    Jcc: 0x70 - 0x7F
     
  5. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    Jcc: 0x70 - 0x7F

    они же легко заменяются на их аналоги дальние
    instr + 0x10 << 8 | 0xF
    все и имеем отображение на Jcc rel8 <---> Jcc rel32

    jmp short: 0xEB

    эта тоже EB на E9

    с ними вот проблем нет изменил пофиксил адрес и все
    а вот такие как loop не имеют дальних аналогов вот и интересно было а какие еще команды не имеют дальних аналогов
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну, если условия позволяют менять код, то почему бы loop не заменить на 'dec ecx'/'jnz XXXXXXXX'?
     
  7. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    впринципе да и так можно вообщем я оставил проверку только на
    jmp rel32 и call rel32 в прологе на остальное думаю можно забить
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    63F45EF45RB65R6VR
    "составные" команды вроде loop это вообще "пережиток старины", сейчас intel склонился в пользу risk архитектуры и сложные команды вроде loop оставил только для совместимости поэтому 'dec ecx'/'jnz XXXXXXXX' еще и быстрее чем loop будет работать.
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    63F45EF45RB65R6VR
    перенос loop задача не сложная:
    Код (Text):
    1.   loop loop_continue
    2.   jmp loop_end
    3. loop_continue:
    4.   jmp loop_start
    гораздо интереснее если внутрь трамплина попадает цель перехода инструкций оставшихся на месте, хотя это наверно маловероятно.
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Black_mirror
    Имеется ввиду вставка джампов после метки и после начала цикла?
    Смутная польза: Переносим loop в трамплин и делаем еще один трамплин из тела цикла?
    Лучше уж менять его на 'dec ecx'/'jnz XXXXXXXX'
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    punxer
    Я имел ввиду перенос самого loop, но если цель его перенесена в трамплин, то столько jmp'ов конечно не нужно.
    А c dec ecx как loope/loopne изобразить?
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Black_mirror
    Я к тому что loop является обьектом переноса.
    Переносим его, а потом вставляем джампы и опять переносим уже тело цикла в другой трамплин
    итого два трамплина формируем. Вариант с loop меняется проще заменой на те инструкции.
    Про loope/loopne есть о чем подумать.
    И вариант со влрженными трамплинами имеет место быть
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Скорее тот вариант и есть для loope
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Вопрос как выполнить декремент до ноля не взволя тф
    И перепрыгнуть если ноль, не обращая внимания на тф)