I have a boot sector that does the following, tested as a floppy in qemu-system-i386:
.code16
movw $0xd00, %bx ## machine code: 0xbb 0x00 0x0d
*Switch to Protected mode here, omitted*
.code32
movw $0xd00, %bx ## machine code: 0x66 0xbb 0x00 0x0d
*Switch back to real mode here, omitted*
.code16
movw $0xd00, %bx ## machine code: 0xbb 0x00 0x0d
This should work fine, but the processor gets confused in the last line, it doesn’t move the value and starts jumping around. If I omit the last “.code16”, which adds an 0x66 to the machine code of the last line, then everything works fine. Why is that?
At first I thought that the procesor was not switching back to real mode, that would explain it, bit it is kind of switching: after the last line cr0 holds 0x10, and I checked that segmentation works as for real mode.
Complete code:
.code16
movw $0xd00, %bx ## machine code: 0xbb 0x00 0x0d
cli
lgdt gdt_register
movl %cr0, %eax
orb $1, %al
movl %eax, %cr0
jmp $0x8, $protected
.code32
protected:
sti
movw $0xd20, %bx ## machine code: 0x66 0xbb 0x00 0x0d
back_to_realmode:
cli
lidtl idt_48
movl %cr0, %eax
andb $0xfe, %al
movl %eax, %cr0
jmp $0x0, $real
.code16
real:
sti
movw $0xd00, %bx
caciquekampeon is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.