jmp short и jmp near - есть ли разница?

Тема в разделе "WASM.BEGINNERS", создана пользователем Tronix, 12 фев 2011.

  1. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Привет, как известно, если длина кода между командой условного или безусловного перехода меньше 127 байт, то можно использовать короткие (short) переходы. Так, например для команды безусловного перехода jmp в можно генерировать опкод 0xEB, если нужно прыгнуть куда-то в пределах 127-байт, или опкод 0xE9, если нужно прыгнуть дальше 128 байт.

    Я всегда считал, что по возможности необходимо использовать короткие переходы, там где это возможно. Более того, почти во всех компиляторах с ассемблера это реализовано "по дефолту", если я пишу jmp bla-bla, то если это возможно генерируется "короткие" переходы.

    Логика которой я руководствовался - во-первых, сам опкод команды короткого перехода меньше, чем опкод ближнего перехода. Меньше размер опкода - значит их тупо больше набьется в кеш. Больше в кеше - быстрее выполняем чем из памяти. Плюс, наверное проще предсказателю ветвлений работать с маленькими значениями.

    Но вот совсем недавно услышал такое мнение:
    "Современные механизмы предсказания ветвлений настолько нивелируют эту разницу, что подобная оптимизация становится сродни ловле блох"

    И я задумался. Возможно действительно, сейчас уже нет никакой разницы? А возможно, что и никогда не было и это лишь мои предположения не основанные ни на каких фактах. Что по этому поводу думаем многоуважаемый all?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Tronix
    Такого пользователя на форуме не зарегистрировано, вы зря ждете его ответа.
    Что касается переходов, то советую почитать оригинальные мануалы (тогда узнаете, что по этому поводу думают непосредственно разработчики), а от себя добавлю, что не вижу разницы в этих командах т.к. адрес все равно надо будет вычислять полный CS:IP(EIP/RIP), чтобы продолжить декодирование потока команд.