Now i have been able to create the gdt's and when i change to pmode, will a short JMP flush the instruciton prefetch queue? here is a sample of my code and the gdt and gdtr content,

mov ax,07c00h
mov ds,ax
lgdt [ds:descr]
;switch to pmode by setting bit 0 of CR0
;after switching to pmode
jmp pmode; when i use JMP 0:7c00h+pmode ir reboots, the 1st 0 is code gdt
pmode:
;here when i try to write to RAM, it will reboot
mov ax,8h;the data segment
mov ds,ax;it reboots here
mov ax,0f44h
mov [0h],ax

descr:
db 0ffh,0ffh,00h,00h,07ch,gdt
gdt:
db 0ffh,0ffh,0,0,0,8a,0cfh,0;code segment
db 0ff,0ffh,0,0,0,82,0cfh,9;data segment

whta am i suppose to do to make my pmode correct, i mean be able to use the descriptors without rebooting? writing to the RAM? pleeeeeeeeeeeeeeeeaaaaaaaaaaaase help. Sam

Recommended Answers

All 6 Replies

As I recall, we sometimes needed to specify the jump to protected mode in a DB statement. Google for John Fine, he has something to get you over that problem, I think.

Looked at Fine's stuff, good in itself, doesn't help you, though.

Here's from http://en.wikipedia.org/wiki/Protected_mode

; set PE bit
mov eax, cr0
or eax, 1
mov cr0, eax

; far jump (cs = selector of code segment)
jmp cs:@pm

@pm:
  ; Now we are in PM.

The point here is to force the assembler to use a far jump. For some assemblers, unfortunately, this requires:

db 0eah ;far jump

For the Pentium and later processors, clearing the prefetch queue is no longer necessary.

i know cs is for the selector but it doesnt select the right selector at all, what memory should i put at GDTR 00007c00h+gdtr or what?

My first thought was "Well, you're probably rebooting because of a triple-fault. Have you defined your interrupt descriptor table (IDT)?"

But now I really see the 7c00, and suppose you're writing a bootloader. It's a lot easier, nowadays, to let grub do the bootloader stuff, but if you insist, there's a lot to go wrong.

What's the nature of your project? Are you just experimenting to learn a lot?

i got it all, will post it later, now the only thig is interrrupts

; far jump (cs = selector of code segment)
jmp cs:@pm

@pm:
  ; Now we are in PM.

The point here is to force the assembler to use a far jump. For some assemblers, unfortunately, this requires:

Hi, I can't make it out how the far jump works out.
Sorry that I've posted a similar question on another thread here. I found this thread after I posted that.

So, how can "jmp cs: @pm" jumps to "@pm"? Isn't it supposed to jump to the physical address "cs * 16 + @pm"?

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.