为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
生活随笔
收集整理的這篇文章主要介紹了
为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是因為?.com ? 載入內存后的起始偏址就是100h. ? 前面的100h字節是該程序的PSP 部分. ? 所以,?為了程序中對地址引用的正確, ? 必需加上org ? 100h語句。 ------------------------------------------------------------------------------------------------------------------------------------------------- FFFF0h與07C00h,這兩個都是機器啟動后默認訪問的內存地址。曾經讓我一度很暈,搞不清他們之間的關系。現在終于搞明白了,寫到博客司上與大家分享。 首先要知道bios是用來初始化硬件的最底層的軟件(然后才是操作系統),因此計算機啟動后必須最先被執行。另外我們都知道CPU只能執行內存中的內容的,而一般內存中的數據是易失性的,斷電之后內容就會消失。工程師的解決方法是:將存放bios的rom芯片與內存芯片統一編址(不明白的話去看看微機原理與接口的書就明白了)。這樣就可以把存放bios的ROM芯片看作是數據永遠不會消失不允許被更改的內存了。
開機啟動后默認的CS=FFFFh IP=0000h。這個地址就是bios的地址。這段內存空間很小,所以不能夠容下操作系統等大型程序。
相對bios而言操作系統的功能更強大,更新也更快但是也需要更多的空間,通常放在硬盤中。但是如果沒有bios的話,那么將會連硬盤都不能使用,又如何啟動存放在硬盤中的操作系統呢?正是由于此,機器啟動后自動執行bios使其它完成硬件初始化(這樣包括硬盤在內的cpu以外的其他硬件設備就可以工作了)。bios完成硬件初始化的任務后,就要把權力移交給操作系統。
工程師進行了強制性的規定:到內存中的07c00h 處尋找系統的引導程序,即CS=0000h IP=7c00h。也就是說任何系統,他的引導程序都必須安排在07c00h開始的地方,否則就不能被正確的引導。當引導程序完成后我們就進入了Linux Windows等系統了。 后面為了調試方便,還可以吧org 07c00h改為0100h,生成 com文件就能直接在dos下運行。cx表示的是字符串的個數,10進制的,可以自行修改,boot sector的結束地址也是固定的,為0xAA55,呵呵,好玩 ----------------------------------------------------------------------------------------------------------------------------------------------------1. boot sector?
在我們接通電源打開計算機時,系統會加電自檢,自檢什么呢?系統加電時cpu會自動進行復位,把相關的寄存器設置成默認值,在IA32架構下,eip被設置為如下值:0000FFF0H,CS的值看起來是這個樣子的:Selector=F000H,Base=FFFF0000H,Limit=FFFFH,Attribute=Present,R/W,Accessed,cr0可能會被設置成如下值:0x60000010。從cr0的值可以知道,系統加電后CPU工作在實模式下(PE位為0)。從eip和cs的值我們知道,加電后CPU執行的第一條指令是:F000H:FFF0H,這條指令一般存在boot rom中,此條指令一般是一條跳轉指令,主要完成CPU外圍設備的初始化,一旦完成后,系統接著會搜索可用的設備(根據BIOS的設置)尋找開始512字節,如果發現其是以0xAA55結束的話,則把其讀入內存位置:0x0000:0x7C00處,然后開始執行。這就是為什么書上的事例代碼要從0x7C00處開始的緣故。好了,到這里,計算機已經開始轉入我們自己寫的操作系統了,另外,書中的代碼如果要在DOS下運行,需要把org 07C00h改為org 0100h,這樣做的目的是因為在DOS下,裝載程序會事先創建一個稱為程序段前綴(PSP)256字節的數據區,用來和被裝載的程序通信,具體的細節請查驗相關資料。而0100h剛好是256個字節的處,這也是代碼段開始執行處。
?????? 說完程序的加載運行,讓我們看看BIOS的10號中斷處理子程序的顯示功能。這里10號中斷有很多子程序,書中用到了13子程序,此子程序就是顯示字符串的,其中的參數如下:ES:BP=串地址;CX=串長度;DH=起始行;DL=起始列;BH=頁號;BL=屬性;AH=子程序編號,這里為13;這里BL是這樣子定義的:閃爍 背景紅 背景綠 背景藍 高亮 前景紅 前景綠 前景藍(順序為高字節到低字節)。這樣BL=0Ch,二進制為:1100,由其定義可知為黑底高亮紅字。
-------------------------------------------------------------------------------------------------------------------------------------------------
開機啟動后默認的CS=FFFFh IP=0000h。這個地址就是bios的地址。這段內存空間很小,所以不能夠容下操作系統等大型程序。
相對bios而言操作系統的功能更強大,更新也更快但是也需要更多的空間,通常放在硬盤中。但是如果沒有bios的話,那么將會連硬盤都不能使用,又如何啟動存放在硬盤中的操作系統呢?正是由于此,機器啟動后自動執行bios使其它完成硬件初始化(這樣包括硬盤在內的cpu以外的其他硬件設備就可以工作了)。bios完成硬件初始化的任務后,就要把權力移交給操作系統。
工程師進行了強制性的規定:到內存中的07c00h 處尋找系統的引導程序,即CS=0000h IP=7c00h。也就是說任何系統,他的引導程序都必須安排在07c00h開始的地方,否則就不能被正確的引導。當引導程序完成后我們就進入了Linux Windows等系統了。 后面為了調試方便,還可以吧org 07c00h改為0100h,生成 com文件就能直接在dos下運行。cx表示的是字符串的個數,10進制的,可以自行修改,boot sector的結束地址也是固定的,為0xAA55,呵呵,好玩 ----------------------------------------------------------------------------------------------------------------------------------------------------1. boot sector?
在我們接通電源打開計算機時,系統會加電自檢,自檢什么呢?系統加電時cpu會自動進行復位,把相關的寄存器設置成默認值,在IA32架構下,eip被設置為如下值:0000FFF0H,CS的值看起來是這個樣子的:Selector=F000H,Base=FFFF0000H,Limit=FFFFH,Attribute=Present,R/W,Accessed,cr0可能會被設置成如下值:0x60000010。從cr0的值可以知道,系統加電后CPU工作在實模式下(PE位為0)。從eip和cs的值我們知道,加電后CPU執行的第一條指令是:F000H:FFF0H,這條指令一般存在boot rom中,此條指令一般是一條跳轉指令,主要完成CPU外圍設備的初始化,一旦完成后,系統接著會搜索可用的設備(根據BIOS的設置)尋找開始512字節,如果發現其是以0xAA55結束的話,則把其讀入內存位置:0x0000:0x7C00處,然后開始執行。這就是為什么書上的事例代碼要從0x7C00處開始的緣故。好了,到這里,計算機已經開始轉入我們自己寫的操作系統了,另外,書中的代碼如果要在DOS下運行,需要把org 07C00h改為org 0100h,這樣做的目的是因為在DOS下,裝載程序會事先創建一個稱為程序段前綴(PSP)256字節的數據區,用來和被裝載的程序通信,具體的細節請查驗相關資料。而0100h剛好是256個字節的處,這也是代碼段開始執行處。
?????? 說完程序的加載運行,讓我們看看BIOS的10號中斷處理子程序的顯示功能。這里10號中斷有很多子程序,書中用到了13子程序,此子程序就是顯示字符串的,其中的參數如下:ES:BP=串地址;CX=串長度;DH=起始行;DL=起始列;BH=頁號;BL=屬性;AH=子程序編號,這里為13;這里BL是這樣子定義的:閃爍 背景紅 背景綠 背景藍 高亮 前景紅 前景綠 前景藍(順序為高字節到低字節)。這樣BL=0Ch,二進制為:1100,由其定義可知為黑底高亮紅字。
-------------------------------------------------------------------------------------------------------------------------------------------------
轉載于:https://www.cnblogs.com/wanghj-dz/archive/2011/05/12/2044062.html
總結
以上是生活随笔為你收集整理的为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到和老公和好了是什么意思
- 下一篇: Windows Phone 实用开发技巧