Как войти в pm - Assembler

Узнай цену своей работы

Формулировка задачи:

вообщем нужно войти в protect mode. Для этого использую флэшку, 0 сектор содержит прогу для загрузки с 1 сектора int 13, 42h в первом секторе прога. все вроде хорошо но дойдя до сюда перезагружается комп. я понимаю что что-то не так но уже все перепробовал. прога взята из книги аблязова с маленькими изменениями. Помогите мне очень хочется подружится с pm. (ветки уже разные просматривал на форуме и не только но увы что такое не пойму!)(до операции hlt не доходит, а reset случается) работаю с фасм
mov     cr0,eax
        db      66h
        db      0EAh            
ENTRY_OFF   dd      PROTECTED_MODE_ENTRY_POINT            
        dw      CODE_SELEKTOR

     CODE_SELEKTOR  db 8h
     DATA_SELEKTOR  equ 10h
     VIDEO_SELEKTOR equ 18h

start:
sti
        mov     ax,3
        int     10h
         cli
        in      al,92h
        or      al,2
        out     92h,al
 
        xor     eax,eax
        mov     ax, cs
        shl     eax,4
        add     eax, PROTECTED_MODE_ENTRY_POINT
        mov     [ENTRY_OFF],eax
 
        xor     eax,eax
        mov     ax,cs
        shl     eax,4
        add     ax, GDT
 
        mov     dword [GDTR+2],eax
        lgdt        fword [GDTR]

        in      al,70h
        or      al,80h
        out     70h,al
 
        mov     eax,cr0
        or      al,1
        mov     cr0,eax

        db      66h
        db      0EAh            
ENTRY_OFF   dd      PROTECTED_MODE_ENTRY_POINT            
        dw      CODE_SELEKTOR

align 8
GDT:
    NULL_descr  db      8 dup(0)
    CODE_descr  db      0FFh,0FFh,00h,00h,00h,10011010b,01000000b,00h
    DATA_descr  db      0FFh,0FFh,00h,00h,00h,10010010b,01000000b,00h
    VIDEO_descr db      0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h
    GDT_size    equ     $-GDT
 
label GDTR fword
        dw      GDT_size-1      
        dd      ?       
 
use32
 
PROTECTED_MODE_ENTRY_POINT:
 
hlt
 
 STACK_BASE_ADDRESS      equ 0f0000h
     USER_PM_CODE_BASE_ADDRESS   equ 0d0000h
     USER_PM_CODE_SIZE equ USER_PM_CODE_END - USER_PM_CODE_BASE_ADDRESS
        
mov        ax, DATA_SELEKTOR
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        esp, STACK_BASE_ADDRESS
 
        call delta
     delta:
        pop ebx
        add ebx, USER_PM_CODE_START-delta
 
        mov        esi, ebx
        mov        edi, USER_PM_CODE_BASE_ADDRESS
        mov        ecx, USER_PM_CODE_SIZE
        rep        movsb

        mov        eax,USER_PM_CODE_BASE_ADDRESS
        jmp        eax
 
USER_PM_CODE_START:
ORG USER_PM_CODE_BASE_ADDRESS
 
        mov        ESI, message
    mov        EDI, 0B8000h        
    mov        ECX,18       
 
    rep        movsb            
    jmp        $        
 
message: db "152535455565758595"

USER_PM_CODE_END:

Решение задачи: «Как войти в pm»

textual
Листинг программы
;с первого диска(флешка должна быть выставлена 1ой)
org 07c00h
use16
start:
cli
mov ax,cs
mov ds,ax
mov dl,80h
lea si,[lba]
;читаем
mov ah,42h
sti
int 13h
cli
jmp far 0000h:0600h
;если ошибка, то выводим сообщение об ошибке
jc error
 
lba:
; +----------------------------------------------------------------------------------+
; | СМЕЩЕНИЕ   ТИП             НАЗНАЧЕНИЕ                    |
; |                                          |
; |   00h     byte          размер структуры                 |
; |   01h     byte          зарезервировано                  |
; |   02h     word           сколько секторов читать                 |
; |   04h     dword    адрес буфера в формате сегмент(word):смещение(word)       |
; |   08h     qword     стартовый номер сектора для чтения           |
; |   10h     qword  хвост 64 битного адреса (используется при 32х битном FFFF:FFFF) |
; +----------------------------------------------------------------------------------+
db 10h
db 00h
dw 01h
dd 00000600h
dq 01h
dq 00h
error:
;jmp far [mes2]
jmp far 0000:0600h
finish:
times 01feh - finish + start db 0
db 055h, 0aah    
;В результате 2й сектор с флешки (1й-MBR) будет считан по адресу в памяти 0000:8600h

Оцени полезность:

11   голосов , оценка 3.818 из 5