如何改变“JMP”和“POPFD”到64位代码?(how to change 'jmp

2019-10-18 07:43发布

什么时候

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

它说的行jmppopfd “在64位模式下不支持的指令”

这是整个代码:

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

Answer 1:

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

至于jmp ,我认为你需要做的一招用retf

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

这工作,因为retf会首先弹出新的指令指针,然后弹出新的cs选择。



文章来源: how to change 'jmp' and 'popfd' to 64-bit code?
标签: assembly nasm