如何使用 MASM 编写远绝对 JMP 或 CALL 指令?具体来说,如何让它使用 EA 和 CA 操作码发出这些指令,而不使用 DB 或其他数据指令手动发出它们?
例如,考虑跳转到引导扇区中 FFFF:0000 处的 BIOS 重置入口点的情况。如果我使用 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)?