《操作系统真相还原》——加载器
显存
将上一章的中断输出,变为显存输出
加载器
使用mbr引导程序从磁盘中加载loader程序。
MBR
%include "boot.inc"
SECTION MBR vstart=0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;clear screenmov ax, 0x600mov bx, 0x700mov cx, 0 mov dx, 0x184f int 0x10 ; int 0x10mov eax, LOADER_START_SECTIONmov cx,1mov bx, LOADER_BASE_ADDR
call rd_disk_m_16 ; read data from diskjmp LOADER_BASE_ADDR
rd_disk_m_16:mov esi, eaxmov di, cxmov dx, 0x1f2mov al, clout dx, almov eax, esimov dx, 0x1f3out dx, almov cl, 8shr eax, clmov dx, 0x1f4out dx,alshr eax, clmov dx, 0x1f5out dx, alshr eax, cland al, 0x0for al, 0xe0mov dx, 0x1f6out dx, almov al, 0x20mov dx, 0x1f7out dx, al.not_ready:nopin al, dxand al, 0x88cmp al, 0x08jnz .not_readymov ax, dimov dx, 256mul dxmov cx, axmov dx, 0x1f0
.go_on_read:in ax, dxmov [bx], axadd bx, 2loop .go_on_readret times 510-($-$$) db 0db 0x55,0xaa
Loader
%include "boot.inc"
SECTION Loader vstart=LOADER_BASE_ADDR mov byte [gs:0x00],'2'mov byte [gs:0x01],0xA4 mov byte [gs:0x02],' 'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'M'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'B'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'R'mov byte [gs:0x09],0xA4 jmp $