I am writing a GDT for a Kernel and all is going well, I'm following this tutorial.
http://www.osdever.net/bkerndev/Docs/gdt.htm
When link the C code to the assembly code he uses this piece of code.
; This will set up our new segment registers. We need to do
; something special in order to set CS. We do what is called a
; far jump. A jump that includes a segment as well as an offset.
; This is declared in C as 'extern void gdt_flush();'
global _gdt_flush ; Allows the C code to link to this
extern _gp ; Says that '_gp' is in another file
_gdt_flush:
lgdt [_gp] ; Load the GDT with our '_gp' which is a special pointer
mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp 0x08:flush2 ; 0x08 is the offset to our code segment: Far jump!
flush2:
ret ; Returns back to the C code!
However, my assembly syntax is different here is what I have so far as part of my boot.s
file.
.global gdt_flush /*Allows the C code to link to this*/
.extern gp /*Says that '_gp' is in another file*/
_gdt_flush:
lgdt gp /*; Load the GDT with our '_gp' which is a special pointer*/
mov %ax, 0x10 /* ; 0x10 is the offset in the GDT to our data segment*/
mov %ds, %ax
mov %es, %ax
mov %fs, %ax
mov %gs, %ax
mov %ss, %ax
jmp flush2 /*; 0x08 is the offset to our code segment: Far jump!*/
flush2:
ret /*; Returns back to the C code!*/
My question is how do I translate the syntax of this instruction into the format I am using?
His: jmp 0x08:flush2 ; 0x08 is the offset to our code segment: Far jump!
Mine: (long l?)jmp ????flush2 /*; 0x08 is the offset to our code segment: Far jump!*/
jmp $0x08, flush2
gives me this error "Error: operand type mismatch for `jmp'" – Excavatejmp $0x08,$flush2
. The label in this case needs to be preceded by a$
. – Vookles