Вообщем я начитался всяких статей по написанию ОС и решил сам поэкспериментировать... Начал я, естественно, с загрузчика, но по непонятным мне причинам, он работает только на моём компе... А я её ещё хотел как курсовик защитить, может быть... Ниже исходники загрузчика. Подскажите пожалуйста, в чём я неправ? [BITS 16] [ORG 0x7c00] _start: cli mov ax, cs mov ds, ax mov ss, ax mov sp, _start sti mov si,boot_msg call print call readkey ;копируем ядро с дискеты в 7e00 mov ax,07E0h mov es,ax mov bx,0 call readkernel lgdt [gd_reg] ;Отрубаем все прерывания cli in al,70h or al,80h out 70h,al ;A20 in al,0x92 or al,2 out 0x92,al ;PMod mov eax,cr0 or al,1 mov cr0,eax jmp 0x08:_protected readkernel: mov ch, 0 mov al,1 mov ah,2 mov cl,2 mov dl,0 mov dh,0 int 13h ret print: lodsb test al,al jz .quit mov ah,0Eh int 10h jmp print .quit: ret readkey: xor ax,ax int 16h ret boot_msg db "Boot message...",13,10,0 gdt: dw 0, 0, 0, 0 db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10011010b db 0xCF db 0x00 db 0xFF db 0xFF db 0x00 db 0x00 db 0x00 db 10010010b db 0xCF db 0x00 gd_reg: dw 8192 dd gdt [BITS 32] _protected: mov ax, 0x10 mov ds, ax mov ss, ax ;копируем ядро из 7e00 в 200000 mov esi, 0x7e00 mov edi, 0x200000 mov ecx, 0x4000 rep movsd ;передаём управление ядру jmp 0x200000 times 510-($-$$) db 0 db 0xaa, 0x55 incbin 'kernel.bin' А вот и ядро [BITS 32] [ORG 0x200000] mov ah,10 mov al,'!' lp: test ah, ah jz qt mov ecx, [cursor] mov [0xB8000+ecx*2], al inc dword [cursor] dec ah jmp lp qt: hlt jmp short $ cursor: dd 0
естественно почему jmp 0x200000? Там должен быть межсегментный Jmp опкод строится так: db 66h ; префикс - изменение разрядности кода db 0EAh ; опкод jmp dd 200000h ; адрес dw 00001000b ; селектор или так jmp селектор:адрес
2 stel123 - А такой БУТ не встречался? что за идиотизм грузится со второго сектора... 390298238__utils.rar