1. 程式人生 > >第二天 組合語言和啟動區

第二天 組合語言和啟動區

基於第一天的基礎上,將機器語言轉成組合語言

簡單總結了下彙編的指令和暫存器:

指令(大小寫均可)
;註釋
DB往檔案例寫入一個位元組的指令
RESB後接數字,表示空出多少個位元組並補上0,RESB 0x1fe-$這裡的$表示一個變數,可以返回這一行現在的位元組數
DW和DB很像,寫入2個位元組16位
DD寫入4個位元組32位
ORG會告訴nask在開始執行的時候把這些機器語言指令轉載到記憶體中的哪個地址,$在這裡表示將要讀入的記憶體地址,而且只能寫0x7c00
JMP相當於C語言的goto,後面接一個目的地的標籤,並執行所在地址的程式
MOV賦值,MOV AX,0表示將0賦值給AX,但是0這個值還存在原位置,有個規則源資料和目的資料位數相同,因此如果記憶體賦給已知大小的暫存器是,可以省略關鍵字(BYTE,WORD,DWORD),MOV AL,BYTE[SI]可寫成MOV AL,[SI]
ADD加法指令,ADD SI,1表示SI=SI+1
CMP比較指令,c中if命令的一部分,CMP a,3比較a和3
JE條件跳轉指令之一,根據比較結果決定是否跳轉,
比如CMP AL,0
JE fin
表示
if(AL==0){goto fin;}
INT軟體中斷指令,用來呼叫BIOS(基本輸入輸出系統)就是各種函式的集合,INT後接數字,不同的數字表示不同的函式,這裡用了0x16(16)用來控制顯示卡用來輸出文字
HLT讓CPU進入待機,但按下鍵盤或滑鼠就會醒來繼續執行,
記憶體
如果命令中出現[]中括號,表示記憶體,比如mov AL,[SI]表示將記憶體中SI所表示的記憶體地址賦給AL
BYTE,WORD,DWORD都是彙編的保留字,分別表示8位(1位元組),16位(2位元組),32位(4位元組)
例如MOV BYTE [678],123表示記憶體678地址儲存01111011
MOV WORD [678],123表示記憶體678地址(下位)儲存01111011,地址679(上位)儲存00000000
MOV DWORD [678],123表示記憶體678地址(下位)儲存01111011,地址679,680,681(上位)都儲存00000000
暫存器也可以代表記憶體地址,但是隻限於BX,BP,SI,DI這四個可以用,因為CPU沒有處理其他暫存器指令的電路
注:記憶體中的地址也不是隨便使用(可檢視記憶體分佈),其中啟動區記憶體裝載地址0x00007c00-0x00007dff

暫存器(相當於內建變數)
8個16位的暫存器,8個8位的暫存器,8個32位的暫存器(如果CPU是32位)
大的暫存器包含小的暫存器,因為CPU的大小已經定了
16位
AX——累加暫存器
CX——計數暫存器
DX——資料暫存器
BX——基址暫存器
SP——棧指標暫存器
BP——基址指標暫存器
SI——源變址暫存器
DI——目的變址暫存器
不管使用哪一個暫存器做中間存貯變數都能得到相同的運算結果,但是就算把這8個全用起來也才有16個位元組
8位
AL——累加暫存器低位
CL——計數暫存器低位
DL——資料暫存器低位
BL——基址暫存器低位
AH——累加暫存器高位
CH——計數暫存器高位
DH——資料暫存器高位
BH——基址暫存器高位
其中AX的0-7位是AL,8-15位是AH。CX,DX,BX一樣;SP,BP,SI,DI中沒有高低8位需要先賦值給AX等有高低位的暫存器,再取值
32位
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI同樣和16位暫存器有一些是公用的
段暫存器(16位)
ES——附加段暫存器
CS——程式碼段暫存器
SS——棧段暫存器
DS——資料段暫存器
FS——沒名稱
GS——沒名稱

下面基於第一天的逐步修改

第一次:https://pan.baidu.com/s/1Rjqi6rKFJK6OuGuIP4paWw

第二次:https://pan.baidu.com/s/1UySuMDUyjcwKxXCijmDp8Q

第三次:https://pan.baidu.com/s/1DcQrTGe1rK8qn_v3dE0IfA

以上都可以用nask.exe來生成img檔案,例如nask.exe helloos.nas helloos.img

nask工具:https://pan.baidu.com/s/1Hkw8cbePEK8hG0x5VbekbQ

 

基於系統盤會變的臃腫,因此製作512位元組的啟動區

啟動區檔案:https://pan.baidu.com/s/1MF0fRi7ngpbhW4bvm6MDCg

nask.exe ipl.nas ipl.bin ipl.lst這時再製作的時候可以輸出以下lst檔案(描述每個指令是怎麼翻譯成機器語言,這時的lst檔案會比較小)

繼續

根據bin檔案來生成img檔案

edimg.exe imgin:fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img

 edimg.exe磁碟映象管理工具:https://pan.baidu.com/s/1IHK5ELsYPyqJlpmiQO2nmg

fdimg0at.tek檔案:https://pan.baidu.com/s/1Nmd9zkGwEoorUboxjooa3A