Как закодировать абсолютную инструкцию JMP / CALL в MASM?
Как я могу написать далеко абсолютную инструкцию JMP или CALL, используя MASM? В частности, как мне заставить его отправлять эти инструкции с использованием кодов операций EA и CA, не отправляя их вручную с использованием DB или других директив данных?
Например, рассмотрим случай перехода к точке входа сброса BIOS в FFFF: 0000 в загрузочном секторе. Если бы я использовал NASM, я мог бы закодировать это в одной инструкции очевидным образом:
jmp 0xffff:0
С ассемблером GNU синтаксис менее очевиден, но следующее сделает работу:
jmp 0xffff, 0
Однако, когда я пробую очевидное решение с MASM:
jmp 0ffffh:0
Я получаю следующую ошибку:
t206b.asm(3) : error A2096:segment, group, or segment register expected
Обходных путей, которые я стараюсь избегатьВ MASM я могу использовать несколько возможных обходных путей, например, любой из следующих:
Вручную соберите инструкцию, выдав машинный код вручную:
DB 0EAh, 0, 0, 0FFh, 0FFh
Используйте далеко непрямой прыжок:
bios_reset DD 0ffff0000h
...
jmp bios_reset ; FF 2E opcode: indirect far jump
Или поместите адрес в стек и используйте команду RET для его «возврата»:
push 0ffffh
push 0
retf
Но могу ли я в любом случае использовать реальную инструкцию JMP и заставить MASM сгенерировать правильный код операции (EA)?