Зачем использовать retf вместо jmp ?

Тема в разделе "WASM.A&O", создана пользователем defiler, 6 май 2009.

  1. defiler

    defiler New Member

    Публикаций:
    0
    Регистрация:
    6 май 2009
    Сообщения:
    3
    Всем доброго времени суток.

    Решил на досуге поковыряться в boot секторе Windows, и нашел там интересную конструкцию по переходу в другую область кода:

    push ax(до этого ax уже был присвоен нуль)
    push word 0x61c
    retf

    спрашивается, что мешало использовать jmp 0x61c ? Не говоря уж о том, что дальний переход тут в принципе не нужен.

    Что это может быть ? Какой-нибудь изощренный способ оптимизации ?
    Просто очень хочется понять, для чего такое нужно...


    Гугл на мой вопрос ответить не смог...
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    defiler
    Надо спросить у microsoft. Но думаю им нужен был именно дальний вызов - jmp 0:0x61.
    Масм этого не умеет.
     
  3. karpen

    karpen New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2009
    Сообщения:
    31
    Можно доку Intel спросить, а именно раздел 3.5 "Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture"
    Из этой же книги, но раздел 6.2.4.2
    Если загрузчик писали на С с большой смесью ассемблера, то такой подход понятен.
     
  4. karpen

    karpen New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2009
    Сообщения:
    31
    Еще в доке от АДМ. Programmer's Manual: Volume 1. Chapter 3.7.6
     
  5. defiler

    defiler New Member

    Публикаций:
    0
    Регистрация:
    6 май 2009
    Сообщения:
    3
    В принципе, можно предположить и такой расклад при передаче управления boot-сектору: cs=0700h,ip=0c00h - тогда требуется переход в другой сегмент. Только я сомневаюсь, что хоть один компьютер распределяет при загрузке подобным образом сегмент со смещением.
    Скорее всего, как уже написал karpen, это какой-нибудь язык высокого уровня оптимизировал задачу.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код бутсектора писался на асме, могу вас заверить. В сети есть исходники утёкшие
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    defiler
    Вы о чём? Если по определённому адресу саморучно грузить код, на который потом нужно перейти, то компилятор не сможет вычислить смещение. Необходимо самим его высчитывать. Но как вы в ручную будете высчитывать относительный адрес? Хотел бы я на это посмотреть.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вернее высчитать то его можно, но будет ли это лучше retf?
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    defiler
    1) Может быть использовано как защита от статического дизассемблирования, особенно если push и retf далеко разнесены по коду -- скрытый jmp пример в аттаче
    2) TASM и MASM не генерят код jmp far 1234h:5678h -- только через db 0EAh, 78h, 56h, 34h, 12h
    3) через jmp far код короче -- EA785634123412 (7 байт) -- db 66h/push/push/retf 66683412/6878563412/CB (10 байт)
    4) и push/retf и jmp far применяются для перехода из Real mode в Protected Mode и обратно примеры в Зубкове и с таким и с другим вариантом, особенно если вблизи есть комбинация из команд mov EAX,CR0/mov CR0,EAX и lgdt
     
  10. defiler

    defiler New Member

    Публикаций:
    0
    Регистрация:
    6 май 2009
    Сообщения:
    3
    Спасибо за ответы.
    Просто привык, когда вижу нестандарный подход к решению какой-то проблемы, считать что это действительно нужно было :) Только не всегда понятен ход мыслей авторов :)