如何将'jmp'和'popfd'更改为64位代码?

时间:2013-07-01 13:48:19

标签: assembly nasm

何时

$ 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

1 个答案:

答案 0 :(得分:3)

由于您处于64位模式,因此您需要使用popfq代替popfd(或者,您可以使用popf)。

对于jmp,我相信您需要使用retf进行操作:

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

这是有效的,因为retf将首先弹出新的指令指针,然后弹出新的cs选择器。