首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-04-12 
NASM怎么实现段间跳转指令?jmp dword selector:offset,编译通不过。我想通过jmp TSS的选择子来实现保护模式

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

热点排行