2013-07-01 54 views
0

如何將'jmp'和'popfd'改爲64位代碼?

$ NASM -f ELF64 -o thisfile.o thisfile.asm

它說: 「在64位模式下不支持指令」 的jmppopfd

這是全代碼:

SELECTOR_KERNEL_CS equ 8 

extern cstart 

extern gdt_ptr 

[SECTION .bss] 
StackSpace  resb 2 * 1024 
StackTop:  

[section .text] 

global _start 

_start: 

    mov esp, StackTop 

    sgdt [gdt_ptr] 
    call cstart  
    lgdt [gdt_ptr]  

    ;lidt [idt_ptr] 

    jmp SELECTOR_KERNEL_CS:csinit 
csinit:  

    push 0 
    popfd ; Pop top of stack into EFLAGS 

    hlt 

回答

2

既然你在64位模式的時候,你就需要使用popfq代替popfd(或者,你可以只使用popf)。

至於jmp,我認爲你需要做的一招用retf

push word SELECTOR_KERNEL_CS 
    push qword csinit 
    retf 
csinit: 
    ... 

這工作,因爲retf會首先彈出新的指令指針,然後在彈出的新cs選擇。

+0

謝謝!那麼我需要如何改變所有'jmp SELECTOR:LABEL'? –