Как войти в 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