本文匯編程序是X86環(huán)境下的,移植其他平臺(tái)可能產(chǎn)生錯(cuò)誤。
一、匯編Demo解析
在前面的文章中建立了一個(gè)簡(jiǎn)單的匯編Demo,令虛擬機(jī)輸出一個(gè)“Helloworld!”字符串。
org 0x7c00 ;程序起始位07c00h
此處的org是Origin的縮寫(xiě),意為起源位置、起始位置。
在此前不管是桌面還是移動(dòng)端,甚至是嵌入式系統(tǒng)的開(kāi)發(fā),工程師都是使用如C,C++,Java等類(lèi)似的高級(jí)語(yǔ)言;而撰寫(xiě)好程序源文件后剩下的事情便交由編譯器去做。
類(lèi)似于程序運(yùn)行需要多少內(nèi)存空間,分配多少時(shí)鐘周期,程序加載位置與棧內(nèi)存等瑣碎的問(wèn)題,我們卻不太關(guān)心。這些操作都由編譯器根據(jù)工程要求進(jìn)行分配。
如果使用Windows環(huán)境,我們通過(guò)屬性可以獲取我們電腦簡(jiǎn)單參數(shù)。如:處理器,系統(tǒng)版本之類(lèi)的。
在其中我們必然會(huì)看到這樣一行:機(jī)帶RAM。其實(shí)這就是通常所說(shuō)的運(yùn)行內(nèi)存,簡(jiǎn)稱(chēng):內(nèi)存。(我的機(jī)器內(nèi)存8G)
我們的程序編譯好后是存放在硬盤(pán)中的。如果沒(méi)有啟用,它與其他千千萬(wàn)萬(wàn)個(gè)文件表現(xiàn)形式一樣,也沒(méi)辦法區(qū)分。
如果我們喚起該程序便會(huì)產(chǎn)生差異。
首先CPU向硬盤(pán)發(fā)送查詢(xún)命令,在硬盤(pán)中找尋該程序機(jī)器碼,在獲知該文件存在后硬盤(pán)向CPU報(bào)告找尋文件就緒;其次CPU向硬盤(pán)發(fā)送將該程序機(jī)器碼拷貝到運(yùn)行內(nèi)存(硬盤(pán)太慢);內(nèi)存就緒后CPU使用IP寄存器指向該地址并步進(jìn)執(zhí)行。
Org作用出現(xiàn)在第二步,硬盤(pán)將程序復(fù)制到內(nèi)存哪個(gè)位置呢?org如是說(shuō):到0x7c00處!于是便復(fù)制到此。
簡(jiǎn)單來(lái)說(shuō)org命令就是標(biāo)志程序加載位置的,此前我們進(jìn)行的程序設(shè)計(jì)沒(méi)有做過(guò)這類(lèi)工作完全歸功于編譯器的功勞。
為什么是0x7c00處呢?深究起來(lái)也并無(wú)其他高深道理,不過(guò)是為保持兼容性,硬件廠商共同約定的事情而已。但是如系統(tǒng)開(kāi)發(fā)不遵循這樣的約定卻又無(wú)法正常啟動(dòng)。畢竟如果所有廠商都遵循的約定就會(huì)成為行業(yè)規(guī)范。
(我下一步計(jì)劃設(shè)計(jì)一個(gè)RISV指令集的CPU,到時(shí)我將不遵循這個(gè)約定。那真是海闊憑魚(yú)躍,天高任鳥(niǎo)飛)
在我們學(xué)習(xí)匯編寫(xiě)操作系統(tǒng)的過(guò)程中還會(huì)有其他耐人尋味的約定,當(dāng)有所涉及再進(jìn)行介紹。
mov ax,cs
mov ds,ax
mov es,ax
從前面的介紹可知:
AX是通用寄存器,在此例中用來(lái)做數(shù)據(jù)拷貝。
CS是代碼段寄存器,用來(lái)存儲(chǔ)該段代碼的入口地址。
ES的附加段寄存器,存放當(dāng)前執(zhí)行程序中一個(gè)輔助數(shù)據(jù)段的段地址。
DS是數(shù)據(jù)段寄存器,在此用于標(biāo)示數(shù)據(jù)段其實(shí)地址。
X86架構(gòu)計(jì)算機(jī)在實(shí)模式下尋址方式是:段+偏移。而這涉及到絕對(duì)地址和邏輯地址概念,這是以后的內(nèi)容,再此我們先簡(jiǎn)單記住這三行是確保三個(gè)寄存器指向同一地址,以便后續(xù)進(jìn)行數(shù)據(jù)操作能定位到正確位置。
這種操作可以總結(jié)為“寄存器對(duì)齊”。
call DispStr
Call是匯編語(yǔ)言中進(jìn)行函數(shù)調(diào)用的助記符,該行意義是跳轉(zhuǎn)到名為DispStr的位置并繼續(xù)執(zhí)行。
call DispStr
mov ax,BootMessage
mov bp,ax ;串地址
mov cx,11 ;串長(zhǎng)度
mov ax,01301h ;AH = 13,AL = 01h
mov bx,000ah ;黑底綠字
mov dl,0
int 10h ;10h號(hào)中斷
ret
上述便是DispStr主體,在程序末位我們使用BootMessage替代"Helloworld!"字符串,此時(shí)BootMessage為存儲(chǔ)Helloworld!內(nèi)存的首地址。
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7650瀏覽量
90542 -
匯編
+關(guān)注
關(guān)注
2文章
214瀏覽量
26517 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
966瀏覽量
29258
發(fā)布評(píng)論請(qǐng)先 登錄
計(jì)算機(jī)安全使用常識(shí)
歐盟為計(jì)算機(jī)和計(jì)算機(jī)服務(wù)器出臺(tái)新生態(tài)設(shè)計(jì)要求
什么是微型計(jì)算機(jī)?微型計(jì)算機(jī)有什么用處?
什么是計(jì)算機(jī)系統(tǒng)、計(jì)算機(jī)硬件和計(jì)算機(jī)軟件?
計(jì)算機(jī)開(kāi)機(jī)啟動(dòng)過(guò)程詳解 精選資料分享
計(jì)算機(jī)組成期末復(fù)習(xí) 精選資料分享
微型計(jì)算機(jī)原理及應(yīng)用
計(jì)算機(jī)應(yīng)用
計(jì)算機(jī)組成原理與匯編語(yǔ)言程序設(shè)計(jì)

計(jì)算機(jī)組成原理與匯編語(yǔ)言習(xí)題一
計(jì)算機(jī)學(xué)習(xí)教程之指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)課件免費(fèi)下載
構(gòu)建 4 位計(jì)算機(jī):匯編語(yǔ)言和匯編器(第 2 部分)

構(gòu)建 4 位計(jì)算機(jī):匯編語(yǔ)言和匯編器(第 1 部分)

計(jì)算機(jī)啟動(dòng)的細(xì)節(jié)與匯編Demo的拆解2

評(píng)論