Hello,DTOS!(中)

org 0x7c00     //主引導程序的入口地址爲0x7c00(物理地址),相似於用c或c++程序中的main函數c++

start:       //定義標籤,標籤的含義就是mov ax,cs這條指令的地址
mov ax,cs
mov ss,ax
mov ds,ax
mov es,ax函數

首先將關鍵寄存器的值設置爲0,可是並無寫成mov ax,0,爲何?
在開始執行的時候,cs這個段寄存器它裏面的值就是0(可利用Bochs調試進行查看),而這個地方要初始化的就是各個段寄存器了。
cs段寄存器表明的是代碼段;
ds表明的數據段
es表明的是附加數據段;
注意在這個程序中並無進行明顯的分段,換句話說,數據段和代碼段是集中在一塊兒的。spa


mov si,msg    //表示將msg這個標籤所表明的地址放到si寄存器中。msg表明的地址就是db 0x0a,0x0a指令的地址

print:
mov al,[si]     //[si]就表示取數據,si寄存器裏面保存的是一個地址,取地址中的數據,就使用[],相似於c語言中的*號。
         // mov al,[si]這條語句執行後,al裏面保存的就是si所指向的內存中第一個字節的數據了
add si, 1       // si= si+1,具體含義就是si所保存的地址值加1.
cmp al, 0x00    //判斷一下有沒有到達數據的末尾,那麼數據的末尾應該如何來標識呢?
                        //判斷一下al裏面保存的數據是不是0x00.若是是,就結束了。
je last              //je這條指令就是看看cmp al,0x00的比較結果是否是相等,若是相等,就跳轉.這就是je的含義了(jump if equal)。調試

                       //跳轉到哪裏呢,跳轉到last這個標籤所表明的地址處。內存

//若是al寄存器中的值不是0x00,就表示咱們應該打印數據
mov ah,0x0e  //設置參數
mov bx,0x0f  //設置參數
int 0x10        //使用int指令來觸發中斷,觸發中斷的結果是什麼呢?就是在屏幕上面打印一個字符。
jmp print字符串

  
last:          //跳轉到這裏意味着數據打印結束了。
hlt              //數據大印結束了,就應該讓cpu中止了。因此使用hlt指令
jmp last     // 無條件跳轉,至關於一個死循環ast


//定義打印到屏幕上的數據了
msg:
db 0x0a,0x0a        //db=define byte 這個地方定義了兩個連續的數據0x0a,0x0a就是換行
db "Hello DIOS"   //繼續使用db來定義字符串
db 0x0a,0x0a       //繼續定義兩個字節的數據,換行符
db 0x00               //0x00就表明了數據的結束符
只看上面的代碼,主引導程序寫完了嗎? 答案是顯然的,沒有
由於主引導程序應該放到主引導區MBR中,那麼主引導區的標誌應該是什麼呢?就是0x55,0xaa
//db 0x55,0xaa //這樣就完事了嗎?尚未。爲何?上面的代碼顯然沒有512個字節,就須要使用填零的操做。怎麼去填零呢?

times 510-($-$$) db 0x00     //$就表示該行的地址,$$就表明這段彙編代碼的起始地址所以$-$$就是表示咱們編寫的彙編代碼一共佔用了多少個字節。510-已經編寫的代碼所佔的字節數,就表明着須要填零的個數了。
//注意一下,這個地方是510去減,而不是512去減。由於下面 db 0x55,0xaa佔用了兩個字節
db 0x55,0xaa循環

相關文章
相關標籤/搜索