Всем доброго времени суток. Решил на досуге поковыряться в boot секторе Windows, и нашел там интересную конструкцию по переходу в другую область кода: push ax(до этого ax уже был присвоен нуль) push word 0x61c retf спрашивается, что мешало использовать jmp 0x61c ? Не говоря уж о том, что дальний переход тут в принципе не нужен. Что это может быть ? Какой-нибудь изощренный способ оптимизации ? Просто очень хочется понять, для чего такое нужно... Гугл на мой вопрос ответить не смог...
defiler Надо спросить у microsoft. Но думаю им нужен был именно дальний вызов - jmp 0:0x61. Масм этого не умеет.
Можно доку Intel спросить, а именно раздел 3.5 "Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture" Из этой же книги, но раздел 6.2.4.2 Если загрузчик писали на С с большой смесью ассемблера, то такой подход понятен.
В принципе, можно предположить и такой расклад при передаче управления boot-сектору: cs=0700h,ip=0c00h - тогда требуется переход в другой сегмент. Только я сомневаюсь, что хоть один компьютер распределяет при загрузке подобным образом сегмент со смещением. Скорее всего, как уже написал karpen, это какой-нибудь язык высокого уровня оптимизировал задачу.
defiler Вы о чём? Если по определённому адресу саморучно грузить код, на который потом нужно перейти, то компилятор не сможет вычислить смещение. Необходимо самим его высчитывать. Но как вы в ручную будете высчитывать относительный адрес? Хотел бы я на это посмотреть.
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
Спасибо за ответы. Просто привык, когда вижу нестандарный подход к решению какой-то проблемы, считать что это действительно нужно было Только не всегда понятен ход мыслей авторов