org 07c00h的原因
Boot Sector(引導扇區),一個正確的BootSector除了以0xAA55結束之外,還應該包含一段少于512B的執行碼
源碼分析
??? org07c00h????????????;告訴編譯器程序加載到7c00處
??? movax,cs
??? movds,ax
??? moves,ax
??? callDispStr?????????;調用顯示字符串例程
??? jmp$??????????????? ;無限循環
DispStr:
??? mov ax,BootMessage
??? mov bp,ax???????????? ;es:bp =串地址
??? mov cx,16???????????? ;cx =串長度
??? mov ax,01301h?????????;ah=13,al=01h
??? mov bx,000ch????????? ;頁號為0(bh=0)黑底紅字(bl=0ch,高亮)
??? mov dl,0
??? int10h???????????????;10h號中斷
??? ret
BootMessage: db "hello ,OS world!"
??? times510-($-$$) db0???;填充剩下的空間,使生成的二進制代碼恰好為
????????????????????? ;512字節
??? dw0xaa55???????????? ;結束標記
???
nasm boot.asm -o boot.bin
硬件自檢相關工作完成后,就會啟動操作系統:以Windows XP為例,系統BIOS將啟動盤的第一扇區(BootSector,引導扇區)讀入到內存的0x7C00H處,并檢查0x7DFE地址的內容是否等于0xAA55,如果匹配,跳轉到0x7C00處執行MBR(MasterBoot Record,主引導記錄),MBR接著從分區表(Partition Table)中找到第一個活動分區(ActivePartition ,一般是C盤分區),然后按照類似方式讀取并執行這個活動分區的引導扇區(Partition BootSector),而引導扇區將負責讀取并執行NTLDR(NT LoaDeR,windowsnt的加載程序),然后主動權就移交給了windows.(來源<使用開源軟件-自己動手寫操作系統>楊文博)
從Xp啟動操作系統的過程中可以看出為什么要用org 0x7c00h;
反編譯
ndisasm -o 0x7c00 boot.bin >>disboot.asm
00007C00?8CC8?????????????mov ax,cs
00007C02?8ED8?????????????mov ds,ax
00007C04?8EC0?????????????mov es,ax
00007C06?E80200???????????call 0x7c0b
00007C09?EBFE?????????????jmp short 0x7c09
00007C0B?B81E7C???????????mov ax,0x7c1e
00007C0E?89C5?????????????mov bp,ax
00007C10?B91000???????????mov cx,0x10
00007C13?B80113???????????mov ax,0x1301
00007C16?BB0C00???????????mov bx,0xc
00007C19?B200?????????????mov dl,0x0
00007C1B?CD10?????????????int 0x10
00007C1D?C3???????????????ret
00007C1E?48???????????????dec ax
00007C1F?656C?????????????gs insb
00007C21?6C???????????????insb
00007C22?6F???????????????outsw
00007C23?2C20?????????????sub al,0x20
00007C25?4F???????????????dec di
00007C26?53???????????????push bx
00007C27?20776F???????????and [bx+0x6f],dh
00007C2A?726C?????????????jc 0x7c98
00007C2C?642100???????????and [fs:bx+si],ax
00007C2F?0000?????????????add [bx+si],al
00007C31?0000?????????????add [bx+si],al
00007C33?0000?????????????add [bx+si],al
00007C35?0000?????????????add [bx+si],al
00007C37?0000?????????????add [bx+si],al
00007C39?0000?????????????add [bx+si],al
00007C3B?0000?????????????add [bx+si],al
00007C3D?0000?????????????add [bx+si],al
00007C3F?0000?????????????add [bx+si],al
00007C41?0000?????????????add [bx+si],al
00007C43?0000?????????????add [bx+si],al
00007C45?0000?????????????add [bx+si],al
00007C47?0000?????????????add [bx+si],al
00007C49?0000?????????????add [bx+si],al
00007C4B?0000?????????????add [bx+si],al
00007C4D?0000?????????????add [bx+si],al
00007C4F?0000?????????????add [bx+si],al
00007C51?0000?????????????add [bx+si],al
00007C53?0000?????????????add [bx+si],al
00007C55?0000?????????????add [bx+si],al
00007C57?0000?????????????add [bx+si],al
00007C59?0000?????????????add [bx+si],al
00007C5B?0000?????????????add [bx+si],al
00007C5D?0000?????????????add [bx+si],al
00007C5F?0000?????????????add [bx+si],al
00007C61?0000?????????????add [bx+si],al
00007C63?0000?????????????add [bx+si],al
00007C65?0000?????????????add [bx+si],al
00007C67?0000?????????????add [bx+si],al
00007C69?0000?????????????add [bx+si],al
00007C6B?0000?????????????add [bx+si],al
00007C6D?0000?????????????add [bx+si],al
00007C6F?0000?????????????add [bx+si],al
00007C71?0000?????????????add [bx+si],al
00007C73?0000?????????????add [bx+si],al
00007C75?0000?????????????add [bx+si],al
00007C77?0000?????????????add [bx+si],al
00007C79?0000?????????????add [bx+si],al
00007C7B?0000?????????????add [bx+si],al
00007C7D?0000?????????????add [bx+si],al
00007C7F?0000?????????????add [bx+si],al
00007C81?0000?????????????add [bx+si],al
00007C83?0000?????????????add [bx+si],al
00007C85?0000?????????????add [bx+si],al
00007C87?0000?????????????add [bx+si],al
00007C89?0000?????????????add [bx+si],al
00007C8B?0000?????????????add [bx+si],al
00007C8D?0000?????????????add [bx+si],al
00007C8F?0000?????????????add [bx+si],al
00007C91?0000?????????????add [bx+si],al
00007C93?0000?????????????add [bx+si],al
00007C95?0000?????????????add [bx+si],al
00007C97?0000?????????????add [bx+si],al
00007C99?0000?????????????add [bx+si],al
00007C9B?0000?????????????add [bx+si],al
00007C9D?0000?????????????add [bx+si],al
00007C9F?0000?????????????add [bx+si],al
00007CA1?0000?????????????add [bx+si],al
00007CA3?0000?????????????add [bx+si],al
00007CA5?0000?????????????add [bx+si],al
00007CA7?0000?????????????add [bx+si],al
00007CA9?0000?????????????add [bx+si],al
00007CAB?0000?????????????add [bx+si],al
00007CAD?0000?????????????add [bx+si],al
00007CAF?0000?????????????add [bx+si],al
00007CB1?0000?????????????add [bx+si],al
00007CB3?0000?????????????add [bx+si],al
00007CB5?0000?????????????add [bx+si],al
00007CB7?0000?????????????add [bx+si],al
00007CB9?0000?????????????add [bx+si],al
00007CBB?0000?????????????add [bx+si],al
00007CBD?0000?????????????add [bx+si],al
00007CBF?0000?????????????add [bx+si],al
00007CC1?0000?????????????add [bx+si],al
00007CC3?0000?????????????add [bx+si],al
00007CC5?0000?????????????add [bx+si],al
00007CC7?0000?????????????add [bx+si],al
00007CC9?0000?????????????add [bx+si],al
00007CCB?0000?????????????add [bx+si],al
00007CCD?0000?????????????add [bx+si],al
00007CCF?0000?????????????add [bx+si],al
00007CD1?0000?????????????add [bx+si],al
00007CD3?0000?????????????add [bx+si],al
00007CD5?0000?????????????add [bx+si],al
00007CD7?0000?????????????add [bx+si],al
00007CD9?0000?????????????add [bx+si],al
00007CDB?0000?????????????add [bx+si],al
00007CDD?0000?????????????add [bx+si],al
00007CDF?0000?????????????add [bx+si],al
00007CE1?0000?????????????add [bx+si],al
00007CE3?0000?????????????add [bx+si],al
00007CE5?0000?????????????add [bx+si],al
00007CE7?0000?????????????add [bx+si],al
00007CE9?0000?????????????add [bx+si],al
00007CEB?0000?????????????add [bx+si],al
00007CED?0000?????????????add [bx+si],al
00007CEF?0000?????????????add [bx+si],al
00007CF1?0000?????????????add [bx+si],al
00007CF3?0000?????????????add [bx+si],al
00007CF5?0000?????????????add [bx+si],al
00007CF7?0000?????????????add [bx+si],al
00007CF9?0000?????????????add [bx+si],al
00007CFB?0000?????????????add [bx+si],al
00007CFD?0000?????????????add [bx+si],al
00007CFF?0000?????????????add [bx+si],al
00007D01?0000?????????????add [bx+si],al
00007D03?0000?????????????add [bx+si],al
00007D05?0000?????????????add [bx+si],al
00007D07?0000?????????????add [bx+si],al
00007D09?0000?????????????add [bx+si],al
00007D0B?0000?????????????add [bx+si],al
00007D0D?0000?????????????add [bx+si],al
00007D0F?0000?????????????add [bx+si],al
00007D11?0000?????????????add [bx+si],al
00007D13?0000?????????????add [bx+si],al
00007D15?0000?????????????add [bx+si],al
00007D17?0000?????????????add [bx+si],al
00007D19?0000?????????????add [bx+si],al
00007D1B?0000?????????????add [bx+si],al
00007D1D?0000?????????????add [bx+si],al
00007D1F?0000?????????????add [bx+si],al
00007D21?0000?????????????add [bx+si],al
00007D23?0000?????????????add [bx+si],al
00007D25?0000?????????????add [bx+si],al
00007D27?0000?????????????add [bx+si],al
00007D29?0000?????????????add [bx+si],al
00007D2B?0000?????????????add [bx+si],al
00007D2D?0000?????????????add [bx+si],al
00007D2F?0000?????????????add [bx+si],al
00007D31?0000?????????????add [bx+si],al
00007D33?0000?????????????add [bx+si],al
00007D35?0000?????????????add [bx+si],al
00007D37?0000?????????????add [bx+si],al
00007D39?0000?????????????add [bx+si],al
00007D3B?0000?????????????add [bx+si],al
00007D3D?0000?????????????add [bx+si],al
00007D3F?0000?????????????add [bx+si],al
00007D41?0000?????????????add [bx+si],al
00007D43?0000?????????????add [bx+si],al
00007D45?0000?????????????add [bx+si],al
00007D47?0000?????????????add [bx+si],al
00007D49?0000?????????????add [bx+si],al
00007D4B?0000?????????????add [bx+si],al
00007D4D?0000?????????????add [bx+si],al
00007D4F?0000?????????????add [bx+si],al
00007D51?0000?????????????add [bx+si],al
00007D53?0000?????????????add [bx+si],al
00007D55?0000?????????????add [bx+si],al
00007D57?0000?????????????add [bx+si],al
00007D59?0000?????????????add [bx+si],al
00007D5B?0000?????????????add [bx+si],al
00007D5D?0000?????????????add [bx+si],al
00007D5F?0000?????????????add [bx+si],al
00007D61?0000?????????????add [bx+si],al
00007D63?0000?????????????add [bx+si],al
00007D65?0000?????????????add [bx+si],al
00007D67?0000?????????????add [bx+si],al
00007D69?0000?????????????add [bx+si],al
00007D6B?0000?????????????add [bx+si],al
00007D6D?0000?????????????add [bx+si],al
00007D6F?0000?????????????add [bx+si],al
00007D71?0000?????????????add [bx+si],al
00007D73?0000?????????????add [bx+si],al
00007D75?0000?????????????add [bx+si],al
00007D77?0000?????????????add [bx+si],al
00007D79?0000?????????????add [bx+si],al
00007D7B?0000?????????????add [bx+si],al
00007D7D?0000?????????????add [bx+si],al
00007D7F?0000?????????????add [bx+si],al
00007D81?0000?????????????add [bx+si],al
00007D83?0000?????????????add [bx+si],al
00007D85?0000?????????????add [bx+si],al
00007D87?0000?????????????add [bx+si],al
00007D89?0000?????????????add [bx+si],al
00007D8B?0000?????????????add [bx+si],al
00007D8D?0000?????????????add [bx+si],al
00007D8F?0000?????????????add [bx+si],al
00007D91?0000?????????????add [bx+si],al
00007D93?0000?????????????add [bx+si],al
00007D95?0000?????????????add [bx+si],al
00007D97?0000?????????????add [bx+si],al
00007D99?0000?????????????add [bx+si],al
00007D9B?0000?????????????add [bx+si],al
00007D9D?0000?????????????add [bx+si],al
00007D9F?0000?????????????add [bx+si],al
00007DA1?0000?????????????add [bx+si],al
00007DA3?0000?????????????add [bx+si],al
00007DA5?0000?????????????add [bx+si],al
00007DA7?0000?????????????add [bx+si],al
00007DA9?0000?????????????add [bx+si],al
00007DAB?0000?????????????add [bx+si],al
00007DAD?0000?????????????add [bx+si],al
00007DAF?0000?????????????add [bx+si],al
00007DB1?0000?????????????add [bx+si],al
00007DB3?0000?????????????add [bx+si],al
00007DB5?0000?????????????add [bx+si],al
00007DB7?0000?????????????add [bx+si],al
00007DB9?0000?????????????add [bx+si],al
00007DBB?0000?????????????add [bx+si],al
00007DBD?0000?????????????add [bx+si],al
00007DBF?0000?????????????add [bx+si],al
00007DC1?0000?????????????add [bx+si],al
00007DC3?0000?????????????add [bx+si],al
00007DC5?0000?????????????add [bx+si],al
00007DC7?0000?????????????add [bx+si],al
00007DC9?0000?????????????add [bx+si],al
00007DCB?0000?????????????add [bx+si],al
00007DCD?0000?????????????add [bx+si],al
00007DCF?0000?????????????add [bx+si],al
00007DD1?0000?????????????add [bx+si],al
00007DD3?0000?????????????add [bx+si],al
00007DD5?0000?????????????add [bx+si],al
00007DD7?0000?????????????add [bx+si],al
00007DD9?0000?????????????add [bx+si],al
00007DDB?0000?????????????add [bx+si],al
00007DDD?0000?????????????add [bx+si],al
00007DDF?0000?????????????add [bx+si],al
00007DE1?0000?????????????add [bx+si],al
00007DE3?0000?????????????add [bx+si],al
00007DE5?0000?????????????add [bx+si],al
00007DE7?0000?????????????add [bx+si],al
00007DE9?0000?????????????add [bx+si],al
00007DEB?0000?????????????add [bx+si],al
00007DED?0000?????????????add [bx+si],al
00007DEF?0000?????????????add [bx+si],al
00007DF1?0000?????????????add [bx+si],al
00007DF3?0000?????????????add [bx+si],al
00007DF5?0000?????????????add [bx+si],al
00007DF7?0000?????????????add [bx+si],al
00007DF9?0000?????????????add [bx+si],al
00007DFB?0000?????????????add [bx+si],al
00007DFD?0055AA???????????add [di-0x56],dl
下面代碼是一個綜合,注意使用宏。ps,宏這個東西還是需要自己來控制的,別認為編譯器給你自動處理了
;�fine_BOOT_DEBUG_?????? ;做bootsector時一定將此行注釋掉!
????????????????????? ;將此行打開后使用nasm boot.asm -o boot.com
?????????????????????;做成一個.com文件易于調試
%ifdef _BOOT_DEBUG_
??? org0100h????????????;調試狀態,做成.com文件,可調試
%else
??? org07c00h????????????;告訴編譯器程序加載到7c00處,boot 狀態,bios將把boot sector 加載到0:7c00處執行
%endif
??? movax,cs
??? movds,ax
??? moves,ax
??? callDispStr?????????;調用顯示字符串例程
??? jmp$??????????????? ;無限循環
DispStr:
??? mov ax,BootMessage
??? mov bp,ax???????????? ;es:bp =串地址
??? mov cx,16???????????? ;cx =串長度
??? mov ax,01301h?????????;ah=13,al=01h
??? mov bx,000ch????????? ;頁號為0(bh=0)黑底紅字(bl=0ch,高亮)
??? mov dl,0
??? int10h???????????????;10h號中斷
??? ret
BootMessage: db "hello ,OS world!"
??? times510-($-$$) db0???;填充剩下的空間,使生成的二進制代碼恰好為
????????????????????? ;512字節
??? dw0xaa55????????????;結束標記???
為什么一定要加載到0x7c00處執行呢?在大灰狼匯編語言視頻中有講解:
當按下電腦電源開關,計算機的啟動步驟:
1.開關按下,發信號給bios
2.bios獲得信號后,啟動自檢程序,檢查周邊設備是否通電完畢。
3.自檢完畢后將控制權還給bios,bios讀取引導啟動器中的啟動程序(引導啟動器可以是光盤,軟盤或者usb,設置是網絡啟動,裝過系統的都應該有深入的理解)
系統的內存安排:
在系統加電最初的1M內存是bios為我們準備好的,他的分布情況為:
?
this picture is quite precise to show thearrangement of this 1M memory,look at the forth floor,you will seeboot loader zone ,and the size is very 512B,that fit ourconclusion.that answers our question,what is the location of bootloader and why the size of it is 512B(1FF==512),that is just doneby bios.
*************************************************************************************************?
org 07c00h?;org指令明確告訴編譯器程序的段地址是7c00而不是0000
???????????;int匯編指令+呼叫的bios中斷編號 int 10h
???????????;10h的中斷提供很多子程序,通過讀取ah寄存器的值來決定條用哪個子程序
??????????;ah=13顯示字符串
mov ax,cs
mov es,ax//我一直用bochs查看cs的內容和地址,但是目前bochs用的很不熟,還沒有看到
movax,msgstr?;msgstr偏移地址給bp,es:bp指向的內容就是我們要顯示的字符串地址
mov bp,ax
mov cx,12?;串長度
mov dh,12?;起始行號
mov dl,36?;起始列號
mov bx,000ch ;bh顯示頁號,bl是顯示的字符的屬性,這里為黑底紅字,高亮,具體屬性查看王爽匯編語言
mov al,1?;顯示的串結構,光標跟隨移動
mov ah,13h?;明確為13h子程序
int 10h
msgstr: db "hello,os"
;$表示當前程序的偏移地址
???????????????????????;$$表示程序開始的地址,
???????????????????????;重復n次,每次填充1byte的0
dw 0xaa55
總結
以上是生活随笔為你收集整理的org 07c00h的原因的全部內容,希望文章能夠幫你解決所遇到的問題。