org 07c00h的原因
Boot Sector(引導(dǎo)扇區(qū)),一個(gè)正確的BootSector除了以0xAA55結(jié)束之外,還應(yīng)該包含一段少于512B的執(zhí)行碼
源碼分析
??? org07c00h????????????;告訴編譯器程序加載到7c00處
??? movax,cs
??? movds,ax
??? moves,ax
??? callDispStr?????????;調(diào)用顯示字符串例程
??? jmp$??????????????? ;無限循環(huán)
DispStr:
??? mov ax,BootMessage
??? mov bp,ax???????????? ;es:bp =串地址
??? mov cx,16???????????? ;cx =串長度
??? mov ax,01301h?????????;ah=13,al=01h
??? mov bx,000ch????????? ;頁號(hào)為0(bh=0)黑底紅字(bl=0ch,高亮)
??? mov dl,0
??? int10h???????????????;10h號(hào)中斷
??? ret
BootMessage: db "hello ,OS world!"
??? times510-($-$$) db0???;填充剩下的空間,使生成的二進(jìn)制代碼恰好為
????????????????????? ;512字節(jié)
??? dw0xaa55???????????? ;結(jié)束標(biāo)記
???
nasm boot.asm -o boot.bin
硬件自檢相關(guān)工作完成后,就會(huì)啟動(dòng)操作系統(tǒng):以Windows XP為例,系統(tǒng)BIOS將啟動(dòng)盤的第一扇區(qū)(BootSector,引導(dǎo)扇區(qū))讀入到內(nèi)存的0x7C00H處,并檢查0x7DFE地址的內(nèi)容是否等于0xAA55,如果匹配,跳轉(zhuǎn)到0x7C00處執(zhí)行MBR(MasterBoot Record,主引導(dǎo)記錄),MBR接著從分區(qū)表(Partition Table)中找到第一個(gè)活動(dòng)分區(qū)(ActivePartition ,一般是C盤分區(qū)),然后按照類似方式讀取并執(zhí)行這個(gè)活動(dòng)分區(qū)的引導(dǎo)扇區(qū)(Partition BootSector),而引導(dǎo)扇區(qū)將負(fù)責(zé)讀取并執(zhí)行NTLDR(NT LoaDeR,windowsnt的加載程序),然后主動(dòng)權(quán)就移交給了windows.(來源<使用開源軟件-自己動(dòng)手寫操作系統(tǒng)>楊文博)
從Xp啟動(dòng)操作系統(tǒng)的過程中可以看出為什么要用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
下面代碼是一個(gè)綜合,注意使用宏。ps,宏這個(gè)東西還是需要自己來控制的,別認(rèn)為編譯器給你自動(dòng)處理了
;�fine_BOOT_DEBUG_?????? ;做bootsector時(shí)一定將此行注釋掉!
????????????????????? ;將此行打開后使用nasm boot.asm -o boot.com
?????????????????????;做成一個(gè).com文件易于調(diào)試
%ifdef _BOOT_DEBUG_
??? org0100h????????????;調(diào)試狀態(tài),做成.com文件,可調(diào)試
%else
??? org07c00h????????????;告訴編譯器程序加載到7c00處,boot 狀態(tài),bios將把boot sector 加載到0:7c00處執(zhí)行
%endif
??? movax,cs
??? movds,ax
??? moves,ax
??? callDispStr?????????;調(diào)用顯示字符串例程
??? jmp$??????????????? ;無限循環(huán)
DispStr:
??? mov ax,BootMessage
??? mov bp,ax???????????? ;es:bp =串地址
??? mov cx,16???????????? ;cx =串長度
??? mov ax,01301h?????????;ah=13,al=01h
??? mov bx,000ch????????? ;頁號(hào)為0(bh=0)黑底紅字(bl=0ch,高亮)
??? mov dl,0
??? int10h???????????????;10h號(hào)中斷
??? ret
BootMessage: db "hello ,OS world!"
??? times510-($-$$) db0???;填充剩下的空間,使生成的二進(jìn)制代碼恰好為
????????????????????? ;512字節(jié)
??? dw0xaa55????????????;結(jié)束標(biāo)記???
為什么一定要加載到0x7c00處執(zhí)行呢?在大灰狼匯編語言視頻中有講解:
當(dāng)按下電腦電源開關(guān),計(jì)算機(jī)的啟動(dòng)步驟:
1.開關(guān)按下,發(fā)信號(hào)給bios
2.bios獲得信號(hào)后,啟動(dòng)自檢程序,檢查周邊設(shè)備是否通電完畢。
3.自檢完畢后將控制權(quán)還給bios,bios讀取引導(dǎo)啟動(dòng)器中的啟動(dòng)程序(引導(dǎo)啟動(dòng)器可以是光盤,軟盤或者usb,設(shè)置是網(wǎng)絡(luò)啟動(dòng),裝過系統(tǒng)的都應(yīng)該有深入的理解)
系統(tǒng)的內(nèi)存安排:
在系統(tǒng)加電最初的1M內(nèi)存是bios為我們準(zhǔn)備好的,他的分布情況為:
?
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中斷編號(hào) int 10h
???????????;10h的中斷提供很多子程序,通過讀取ah寄存器的值來決定條用哪個(gè)子程序
??????????;ah=13顯示字符串
mov ax,cs
mov es,ax//我一直用bochs查看cs的內(nèi)容和地址,但是目前bochs用的很不熟,還沒有看到
movax,msgstr?;msgstr偏移地址給bp,es:bp指向的內(nèi)容就是我們要顯示的字符串地址
mov bp,ax
mov cx,12?;串長度
mov dh,12?;起始行號(hào)
mov dl,36?;起始列號(hào)
mov bx,000ch ;bh顯示頁號(hào),bl是顯示的字符的屬性,這里為黑底紅字,高亮,具體屬性查看王爽匯編語言
mov al,1?;顯示的串結(jié)構(gòu),光標(biāo)跟隨移動(dòng)
mov ah,13h?;明確為13h子程序
int 10h
msgstr: db "hello,os"
;$表示當(dāng)前程序的偏移地址
???????????????????????;$$表示程序開始的地址,
???????????????????????;重復(fù)n次,每次填充1byte的0
dw 0xaa55
總結(jié)
以上是生活随笔為你收集整理的org 07c00h的原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。