2013-04-15 4 views
0

Поскольку адрес хххй: 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

См. [This] (http://en.wikipedia.org/wiki/FWord), и в моей ситуации метод выбирает правильный tss для jmp, так что адрес неизвестен до его запуска, поэтому jmp xxxx: yyyyyyyyy бесполезно. – reavenisadesk

+0

@AkiSuihkonen Вы ошибаетесь. Речь идет о форме 'JMP ptr16: 32', но есть также' JMP m16: 32'. См. Руководство Intel или AMD. –

+0

Nasm - хороший семейный ассемблер и не знает флага. :) Просто 'jmp far [address]' должен это сделать. Может быть, 'jmp far dword [address]', если это не в 32-битном коде. –

ответ

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 a tss, чем меняю другой tss2, будет ли jmp на tss2? – reavenisadesk