NASM怎么实现段间跳转指令?jmp dword selector:offset,编译通不过。
我想通过jmp TSS的选择子来实现保护模式下的任务切换,这个jmp selector:0指令该怎么写呢?用NASM,且selector保存在变量中。
每个任务定义了一个tss结构和选择子tss_sel变量,p_proc_ready指向下一个将要运行的任务。
start_proc:
mov esp, [p_proc_ready] ;---取得将要运行的任务的进程表地址
mov ebp, [esp + P_TSS_SEL];---取得将要运行的任务的TSS地址
xor eax, eax
mov ax, [ebp];---取得将要运行的任务的TSS段选择子
jmp ax;---通过跳转至任务状态段实现任务切换:jmp ax:0,但这样的话编译通不过
;----error: invalid combination of opcode and operands
;-----同时还试过jmp dword [p_proc_ready + P_TSS_SEL]:0
;-----jmp dword [ebp + P_TSS_SEL]:0都无法通过编译
;-----这个指令该怎么写呢?我试了一下直接用jmp dword 0x7c00:0是可以的。
;jmp dword 0x100:0
dec dword [k_reenter]
pop gs
pop fs
pop es
pop ds
popad
add esp, 4
iretd
[解决办法]
nasm和fasm或者yasm自由度都非常大,相反masm比较规矩一点,nasm应该可以。
[解决办法]
push word [ebp]
push 0x100
retf
[解决办法]
或者(fasm 与nasm语法相似):
32位模式:
push dword [ebp] ;32-bit pop, high-order 16 bits discarded, segment descriptor
push dword 0x12340000 ;EIP
retf ;0xCB 远跳
64位模式:
mov rax,0x123456789
push qword [rbp] ;high-order 48 bits discarded; segment
push rax ;RIP
retf ;0xCB 远跳
[解决办法]
嗯,retf只试过段间跳转无特权级变化的跳转。利用段间转移指令jmp或段间调用指令call,通过任务门或直接通过任务状态段,可以切换到别的任务。
如通过任务门:jmp 门选择子:0
代码细节可以参考:
http://www.aogosoft.com/index.asp?format=download
《保护模式编程教程》-李彦昌
[解决办法]
如果你看看相关指令,应该不会有什么问题。
Far Jumps in Protected Mode. When the processor is operating in protected mode, the JMP instruction can be used to perform the following three types of far jumps:
? A far jump to a conforming or non-conforming code segment.
? A far jump through a call gate.
? A task switch.
比如使用调用门:
JMP ptr16:16 Jump far, absolute, address given in operand
形如你上面的jmp 0x10:0
当然还有对应的间接方式:
JMP m16:16 Jump far, absolute indirect, address given in m16:16
mov word [JmpOFFSET],0
mov word [JmpSELECT],0x10
jmp far [JmpOFFSET] ;机器码(16位代码段下执行):FF 2E ** **
;------------------------------
JMP ptr16:32 / JMP m16:32也类似。
[解决办法]
上面的数据定义顺序也要遵守:
.data
JmpOFFSET:
dw 0
JmpSELECT:
dw 0
[解决办法]
[bits 32]
jmp 0x8:0x1234