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

計算機組成原理與匯編語言習題一
計算機學習教程之指令系統(tǒng)與匯編語言程序設計課件免費下載
構建 4 位計算機:匯編語言和匯編器(第 2 部分)

構建 4 位計算機:匯編語言和匯編器(第 1 部分)

評論