我试了一下,nasm只要直接call far [xxx]就可以,masm需要call fword ptr [xxx]。
需要注意的是不论nasm、masm在64位模式下的far return指令都没有生成rex.w前缀,必须手工补上才能正确返回。
另外,虽然intel手册上说了call far m16:32在64位模式下可用,但实测会产生异常,即便连接时用/largeaddressaware:no限制加载在4GB以上地址也不行。必须要用call far m16:64才行,而该指令在amd64处理器上并不支持。amd64上不支持80位far地址,只认48位far地址。
global _start
section .data use64
farptr:
dq test1 ; for intel64 only
dw 33h
section .code use64
_start:
call far [farptr]
ret
test1:
db 48h
retf