V86:是的,这是正确的方法,但如果要设置操作系统:
可以尝试这个(设计用于长模式,但应该可以工作。我还没有测试过,但我看不出为什么它不会工作。问题不在nasm上,而在ld上。)
LD H8s 16位ELF / aout引用。从GRUB加载是标准做法。
我知道32位CS有问题,我需要再检查一下位置。否则看起来还可以。
这是难以找到的代码。
- -
;修改为32位??
mov dword [.stckptr], esp
sgdt [.gdtv32]
lgdt [.gdtv16]
sidt [.idt32]
lidt [.idt16]
push DESC_REAL
push @f-10000h
retfd
.stckptr:
dd 0
align 16
.gdtv32:
dw 0
dd 0
align 16
.gdtv16:
dw .gdtend-.gdt-1
dd .gdt,0
align 16
.gdt:
dd 0,0
DESC_DATA=8
DESC_LONG=$-.gdt
dd 00000000h,00209800h
DESC_REAL=$-.gdt
dd 0000FFFFh,00009801h
.gdtend:
align 16
.idt32:
dw 0
dd 0
align 16
.idt16:
dw 3FFh
dd 0
USE16
@@: mov eax, cr0
and eax, 7FFFFFFEh
mov cr0, eax
mov esp, realmode_stack_top
xor ax, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp 1000h:@f-10000h
@@:
mov ax, 3
int 10h
mov eax, cr0
or eax, 80000001h
mov cr0, eax
db 66h
db 0EAh
dd @f
dw DESC_LONG
USE32
@@: lgdt [cs:.gdtv32]
mov ax, DESC_DATA
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
lidt [.idt32]
mov rsp, qword [.stckptr]
mov eax, @f
jmp eax
@@: