2013-04-15 28 views
0

由于地址XXXX:YYYYYYYY是在保护模式下32位,我把48位地址在一块内存,想给间接jmp,这里是我写的:关于间接JMP问题,在保护模式下

mov eax,s1 
mov [address],eax 
mov ax,SelectorCode32 
mov [address+4],ax 
jmp fword [address] 

address:dd 0 
     dw 0 

但nasm显示jmp fword [address]是错误的,我读过一些建议,如this,但也没有帮助,所以我该怎么办?

+0

看到[这个](http://en.wikipedia.org/wiki/FWord),在我的情况下,一个方法选择一个正确的tss到jmp,所以地址在运行前是未知的,所以jmp xxxx: yyyyyyyy是无用的。 – reavenisadesk

+0

@AkiSuihkonen你错了。你说的是'JMP ptr16:32'形式,但也有'JMP m16:32'。请参阅您的英特尔或AMD手册。 –

+0

纳斯姆是一个不错的家庭装配者,不知道这个词。 :)只要'jmp far [address]'应该这样做。如果它不在32位代码中,可能是'jmp far dword [address]'。 –

回答

2

近距离和远距离通话的NASM语法不同于TASM和MASM的语法。

这里是间接跳转两个选项:

jmp [fptr] ; jump to CS:0x12345678 
jmp far [fptr] ; jump to 0xABCD:0x12345678 

fptr dd 0x12345678 
    dw 0xABCD 

您也可以随时推远地址到堆栈,做retf

+0

这是否意味着在程序运行之前,它本身已经知道在哪里跳转?如果在运行后更改地址,该怎么办? – reavenisadesk

+0

我不明白这个问题。 –

+0

对不起我的英语很差,让我这样问:如果我更改[FPTR]它运行后,将程序跳转到我给了他新的地址?我的目的是,当程序运行时,我使cpu jmp成为一个tss,比我换另一个tss2,它会跳转到tss2吗? – reavenisadesk