проблема с переходом в реальный режим

Я пишу загрузчик. При загрузке ядра нужно переключиться в защищенный режим для копирования в память >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 становиться странный. я сравнивал дампы этой области памяти до и после переключения в реальный режим, они были одинаковые. подскажите что делать


Ответы (0 шт):