Проблема с дальним jamp'ом в FASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем hakerkirik, 4 авг 2008.

  1. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    Возникла следующая проблема. Пишу следующий код:
    Код (Text):
    1. jmp dword ecx
    В ECX я занес сегмент и смещение метки. Но это не важно. Важно то, как FASM компилирует это дело. В дебагере я увидел вместо
    Код (Text):
    1. jmp far ecx
    вот это
    Код (Text):
    1. jmp cx
    . Скажите, как можно решить этот вопрос.
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    И фасм кривой и отладчик твой.
     
  3. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    CrystalIC, ну за отладчик у меня сейчас Bochs.
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    CrystalIC, просьба обходиться без необоснованных наездов.
    hakerkirk
    В системе команд x86 физически отсутствует дальний регистровый jmp. Так что на
    Код (Text):
    1. jmp far ecx
    компилятор ругается. Ну а
    Код (Text):
    1. jmp dword ecx
    означает в точности то же самое, что и jmp ecx, то есть 32-битный близкий переход.
    Правильный код для этой цели может выглядеть, например, так:
    Код (Text):
    1. push ecx
    2. retf
     
  5. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    diamond
    Никаких наездов пока небыло. Сам посуди - уважаемый сказал что фасм компилит инструкцию jmp dword ecx, такой нет. А отладчик дизасмил jmp cx, такой инструкции тоже нет. И вообще
    такого быть не может. В принципе мне всёравно, я фасмом и бошем не пользуюсь, таких проблем не возникает.
     
  6. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    diamond, спасибо. Хотя в ТАСМе у меня "jmp dword ecx" прокатывало как дальний джамп....
     
  7. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    CrystalIC, а такого тоже быть не может? )
    Код (Text):
    1. mov     cx, [Selector_PM_Code]
    2.     shl     ecx, 16
    3.     mov     cx, PMode_Entry
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    hakerkirik
    Вобщем я не буду спорить, скажу лишь что Интел создала систему команд и мнемонических обозначений, которой и следует придерживаться.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Как это нет? В 16-битном режиме машинный код 66 FF E1 для jmp ecx = jmp dword ecx, FF E1 для jmp cx, в 32-битном - наоборот.
    Мда? Машинный код сгенерированной команды или хотя бы исходник на tasm - в студию...
     
  10. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    FF18 call far fword ptr ds:[eax]
    FF28 jmp far fword ptr ds:[eax]
    FF2D 00000000 jmp far fword ptr ds:[0]
    FF1D 00000000 call far fword ptr ds:[0]
    Заюзайте гейт инструкцией "jmp dword ecx"
    Лол :)))
     
  11. hakerkirik

    hakerkirik New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2005
    Сообщения:
    28
    diamond, я немного попутал. Вместо ecx, я в тасме использовал переменную dword. Т.е. было так "jmp dword FarJmpAddr". Перед этим я зносил туда оффсет и сегмент.
    Просто где-то на rusfaq видел исходник где использовали 32-х разрядный eax для дальнего джампа. Там вроде применялся префикс изменения разрядности или что-то типа этого.