При написании собственной ос решил попробовать примеров но этот код вроде работает но почему то не выводится последнее сообщение Код (Text): ;memory map 0x0 use16 org 0x0 jmp start_boot start_msg db 13,10,'Starting boot',0 loadp_msg db 13,10,'Go to protected mode...',0 lens_msg: print_message: push ax bx cx dx print: lodsb or al,al je end_print mov ah,0eh mov bx,07h int 10h jmp print end_print: pop dx cx bx ax retn start_boot: ;setup selectors mov ax,0x1000 mov es,ax mov ds,ax mov ax,0x2000 mov ss,ax mov sp,0xffff ;print intro message mov si,start_msg call print_message ;print warning message mov si,loadp_msg call print_message ;================================ ; switch to 32 bit protected mode ;================================ ;GDTs os_data equ os_data_1-gdts os_code equ os_code_1-gdts ;disable all irqs cli ;mask all irqs mov al,255 out 0xa1,al out 0x21,al ;enable a20 f1: in al,0x64 test al,2 jnz f1 mov al,0xd1 out 0x64,al f2: in al,0x64 test al,2 jnz f2 mov al,0xdf out 0x60,al f3: in al,0x64 test al,2 jnz f3 mov al,0xff out 0x64,al ;load global descriptor table lgdt [cs:gdts-0x10000] ;enable protected mode mov eax,cr0 or al,1 mov cr0,eax jmp $+2 ;jmp to enable 32 bit mode jmp pword os_code:c32 use32 kernel_32bit: org $+0x10000 ;================= ;32 bit entry ;================= align 4 c32: ;Setup selectors mov ax,os_data mov ds,ax mov fs,ax mov gs,ax mov ss,ax mov es,ax mov esp,0x3ec00 ;making page catalog mov edi,0x100000 ;start of page catalog mov eax,0x101007 ;one significant element stosd mov ecx,1023 ;other 1023 elements xor eax,eax rep stosd ;making page table 0 mov eax,0x7 mov ecx,1024 fill_page_table: stosd add eax,0x1000 loop fill_page_table ;move catalog address in cr3 mov eax,0x100000 mov cr3,eax ;enable page addressing mov eax,cr0 or eax,0x8000000 mov cr0,eax ;print message of enbled page addressing mov esi,mes mov edi,0xb8000+800 _puts: lodsb mov ah,0x7 stosw test al,al jnz _puts ;change phisical adress page 12000h on 0b8000h mov eax,0xb8007 mov [es:0x101000+0x12*4],eax ;print mes1 in standart adress mov esi,mes1 mov edi,0xb8000+930 _puts1: lodsb mov ah,0x7 stosw test al,al jnz _puts1 ;print mes2 in unstandart adress mov esi,mes2 mov edi,0x12000+1000 _puts2: lodsb mov ah,0x7 stosw test al,al jnz _puts2 hlt mes db 'Page addressing in enabled' db 0 mes1 db 'This string was outputted to standart adress 0b8000h...' db 0 mes2 db 'And this one - to dummy adress 0x120a0. Cool?' db 'Now press RESET...' db 0 gdts: dw gdte-$-1 dd gdts dw 0 os_code_1: dq 0x00cf9a000000ffff os_data_1: dq 0x00cf92000000ffff gdte: загрузчик взят немног допиленный из menuet OS
И вообще в в этом коде багов больше чем видно но не там где вы указали. + я уже давно переправил версию на насме и там все заработало
Этот код компилил фасмом, текущий насмом. Загружаестя своим загрузчиком с дискеты. Там он находится в виде бинарного файла.