проблема с переходом в реальный режим
Я пишу загрузчик. При загрузке ядра нужно переключиться в защищенный режим для копирования в память >1мб а потом обратно. Но после перехода обратно в реальный режим все ломается.
loadloop:
*настройка для чтения с int 13h*
*тут происходит копирование и переход в pm*
mov eax, cr0
btr eax, 0
mov cr0, eax
jmp 0:rm
bits 16
rm:
xor eax,eax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x7BFF
sti
sub ecx, SECTORS_PER_LOAD
jz done
%if TOTAL_SECTORS % SECTORS_PER_LOAD
cmp ecx, SECTORS_PER_LOAD
jb last
%endif
jmp 0:loadloop
%if TOTAL_SECTORS % SECTORS_PER_LOAD
Вот что было на первой итерации
1: x/i $pc
=> 0x7e21: mov ah,0x42
2: $ecx = 255
(gdb) ni
0x00007e23 in ?? ()
1: x/i $pc
=> 0x7e23: mov esi,0x168a7f6e
2: $ecx = 255
(gdb) ni
0x00007e26 in ?? ()
1: x/i $pc
=> 0x7e26: mov dl,BYTE PTR [esi]
2: $ecx = 255
(gdb) ni
0x00007e2a in ?? ()
1: x/i $pc
=> 0x7e2a: int 0x13
2: $ecx = 255
а вот что на второй
1: x/i $pc
=> 0x7e21: mov ah,0x42
2: $ecx = 128
(gdb) ni
0x00007e22 in ?? ()
1: x/i $pc
=> 0x7e22: inc edx
2: $ecx = 128
(gdb) ni
0x00007e23 in ?? ()
1: x/i $pc
=> 0x7e23: mov esi,0x168a7f6e
2: $ecx = 128
(gdb) ni
0x00007e24 in ?? ()
1: x/i $pc
=> 0x7e24: outs dx,BYTE PTR ds:[esi]
2: $ecx = 128
(gdb) ni
0x00007e25 in ?? ()
1: x/i $pc
=> 0x7e25: jg 0x7db1
2: $ecx = 128
(gdb) ni
0x00007e26 in ?? ()
1: x/i $pc
=> 0x7e26: mov dl,BYTE PTR [esi]
2: $ecx = 128
(gdb) ni
0x00007e27 in ?? ()
1: x/i $pc
=> 0x7e27: push ss
2: $ecx = 128
(gdb) ni
0x00007e28 in ?? ()
1: x/i $pc
=> 0x7e28: std
2: $ecx = 128
(gdb) ni
0x00007e29 in ?? ()
1: x/i $pc
=> 0x7e29: jge 0x7df8
2: $ecx = 128
(gdb) ni
0x00007e2a in ?? ()
1: x/i $pc
=> 0x7e2a: int 0x13
2: $ecx = 128
после прерывания программа просто зависает и eip становиться странный. я сравнивал дампы этой области памяти до и после переключения в реальный режим, они были одинаковые. подскажите что делать