当前位置: 代码迷 >> 汇编语言 >> NASM如何实现段间跳转指令?jmp dword selector:offset,编译通不过
  详细解决方案

NASM如何实现段间跳转指令?jmp dword selector:offset,编译通不过

热度:9833   发布时间:2013-02-26 00:00:00.0
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
  相关解决方案