Возникла следующая проблема. Пишу следующий код: Код (Text): jmp dword ecx В ECX я занес сегмент и смещение метки. Но это не важно. Важно то, как FASM компилирует это дело. В дебагере я увидел вместо Код (Text): jmp far ecx вот это Код (Text): jmp cx . Скажите, как можно решить этот вопрос.
CrystalIC, просьба обходиться без необоснованных наездов. hakerkirk В системе команд x86 физически отсутствует дальний регистровый jmp. Так что на Код (Text): jmp far ecx компилятор ругается. Ну а Код (Text): jmp dword ecx означает в точности то же самое, что и jmp ecx, то есть 32-битный близкий переход. Правильный код для этой цели может выглядеть, например, так: Код (Text): push ecx retf
diamond Никаких наездов пока небыло. Сам посуди - уважаемый сказал что фасм компилит инструкцию jmp dword ecx, такой нет. А отладчик дизасмил jmp cx, такой инструкции тоже нет. И вообще такого быть не может. В принципе мне всёравно, я фасмом и бошем не пользуюсь, таких проблем не возникает.
CrystalIC, а такого тоже быть не может? ) Код (Text): mov cx, [Selector_PM_Code] shl ecx, 16 mov cx, PMode_Entry
hakerkirik Вобщем я не буду спорить, скажу лишь что Интел создала систему команд и мнемонических обозначений, которой и следует придерживаться.
Как это нет? В 16-битном режиме машинный код 66 FF E1 для jmp ecx = jmp dword ecx, FF E1 для jmp cx, в 32-битном - наоборот. Мда? Машинный код сгенерированной команды или хотя бы исходник на tasm - в студию...
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" Лол ))
diamond, я немного попутал. Вместо ecx, я в тасме использовал переменную dword. Т.е. было так "jmp dword FarJmpAddr". Перед этим я зносил туда оффсет и сегмент. Просто где-то на rusfaq видел исходник где использовали 32-х разрядный eax для дальнего джампа. Там вроде применялся префикс изменения разрядности или что-то типа этого.