開發(fā)OS二日目之必要匯編指令

2e2eb9389b504fc2e40ad6e0e4dde71191ef6df9.jpg

一看到題目寫著 匯編二字辣卒,是不是心里一瞬間就產(chǎn)生畏懼感了呢(笑)鼓蜒,其實(shí)匯編沒有想得那么可怕的,我第一次接觸匯編的時(shí)候因?yàn)椴坏梅ù茁玻彩歉械筋^昏腦漲党晋,被一堆寄存器搞得暈暈乎乎谭胚,現(xiàn)在回頭再看徐块,發(fā)現(xiàn)其實(shí)理清楚邏輯,它并沒有那么可怕灾而。

之所以在這里介紹幾個(gè)匯編指令是因?yàn)楹兀陂_發(fā)OS的過程中,如果一直用二進(jìn)制編碼去寫程序是一件讓人很難受的事情旁趟,而借助匯編昼激,可以極大的縮短代碼量,更好的理清思維锡搜。 在第一篇文章中我們用二進(jìn)制編輯器寫出了一個(gè)簡(jiǎn)單的開機(jī)引導(dǎo)橙困,在這一篇文章中我們用匯編語言對(duì)其進(jìn)行改寫,不要這么快就畏懼哦~相信看完本文耕餐,大家對(duì)匯編會(huì)有一個(gè)新的認(rèn)識(shí)凡傅, “哦,其實(shí)匯編并不是很可怕嘛~”

首先看一下改寫之后的代碼

匯編代碼表示

; hello-os
; TAB=4

    ORG     0x7c00          
    JMP     entry
    DB      0x90
    DB      "HELLOIPL"      
    DW      512           
    DB      1            
    DW      1              
    DB      2               
    DW      224           
    DW      2880            
    DB      0xf0            
    DW      9                
    DW      18          
    DW      2             
    DD      0               
    DD      2880         
    DB      0,0,0x29      
    DD      0xffffffff     
    DB      "HELLO-OS   "   
    DB      "FAT12   "      
    RESB    18              

entry:
MOV AX,0
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1
CMP AL,0
JE fin
MOV AH,0x0e
MOV BX,15
INT 0x10
JMP putloop
fin:
HLT
JMP fin
msg:
DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB 0
RESB 0x7dfe-$
DB 0x55, 0xaa
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
好吧肠缔,我承認(rèn)這一堆看起來很難受夏跷,那么我們把它改寫成C代碼,這樣開起來就會(huì)容易些

C代碼表示

entry:
AX = 0;
SS = AX;
SP = 0X7C00;
DS = AX;
ES = AX;
SI = msg;
putloop:
AL = BYTE[SI];
SI = SI + 1;
if(AL == 0)
{
goto fin;
}
AH = 0X0E;
BX = 15;
INT 0X10;
goto putloop;
fin:
HLT;
goto fin;
這樣看起來好多了吧

不過好像那些奇怪的大寫字符還是很多明未,別急槽华,那些就是開頭提到的寄存器了,接下來詳細(xì)解釋一下這些寄存器的功能和語句的含義亚隅。

詳解匯編語句以及寄存器

DB指令:即data byte硼莽,它的含義是往文件中直接寫入1個(gè)字節(jié)的指令
RESB指令:即reserve byte,從當(dāng)前的地址開始空出N個(gè)字節(jié)庶溶, eg:RESB 10:從當(dāng)前地址空出10個(gè)字節(jié)
DW:data word煮纵,代表8位(2字節(jié))
DD:data doubleword,代表16位(4字節(jié))
IPL:initial program loader偏螺,啟動(dòng)程序加載器

MOV指令:很常用的指令行疏,功能非常簡(jiǎn)單,即賦值
eg: MOV AX, 0 ;即AX = 0; MOV SS, AX ;即SS = AX套像; 還是很好理解吧~

寄存器解釋

接下來就是重頭戲了酿联,也就是對(duì)幾個(gè)重要的寄存器進(jìn)行解釋

AX(accumulator):累加寄存器(進(jìn)行加法運(yùn)算)
CX(counter):計(jì)數(shù)寄存器
DX(data):數(shù)據(jù)寄存器
BX(base):基址寄存器,(大家在數(shù)據(jù)結(jié)構(gòu)應(yīng)該接觸過這個(gè)概念夺巩,就是地址的起始參照地址)
SP(stackpointer):棧指針寄存器
BP(basepointer):基址指針寄存器
SI(sourceindex):源變址寄存器
DI(destinationindex):目的變址寄存器 ps:上面所說的都是16位寄存器
下面的寄存器是8位寄存器贞让,很簡(jiǎn)單是將上述的AX,CX,DX,BX分為高八位低八位

AH,CH,DH,BH:他們是上述的寄存器的高八位(high)
AL,CL,DL,BL:他們是上述的寄存器的低八位(low)
有心的同學(xué)們?cè)谶@里也會(huì)會(huì)發(fā)問,

”既然有16位和8位寄存器柳譬,那么有沒有32位的寄存器呢喳张?” 當(dāng)然是有的,因?yàn)槲覀冇玫牟欢嗝腊模@里就不贅述了销部,感興趣的可以去google一下摸航,相信會(huì)有很多收獲。

那我們繼續(xù)舅桩,接下來說到的是段寄存器

ES(extra segment):附加段寄存器
CS(code segment):代碼段寄存器
SS(stack segment):棧段寄存器
DS(data segment):數(shù)據(jù)段寄存器 他們的功能從名稱上就可以反映出來
大家看下面這條語句

MOV AX [SI]
如果SI沒有加“[]”酱虎,大家都能猜到他的作用是將SI中的數(shù)據(jù)賦值給AX,但此處加了括號(hào)擂涛,它的意思就變成將 SI的地址存儲(chǔ)到AX中读串。 MOV指令有一個(gè)規(guī)則,即源數(shù)據(jù)和目的數(shù)據(jù)必須位數(shù)相同 所以上述語句就是講SI地址的 一個(gè)字節(jié)給予AX歼指。

ADD指令 顧名思義爹土,進(jìn)行加法運(yùn)算,比如: >ADD SI, 1 ; SI = SI + 10:從當(dāng)前地址空出10個(gè)字節(jié)
CMP指令 比較指令
JE指令 條件跳轉(zhuǎn)指令踩身,根據(jù)比較的結(jié)果決定跳轉(zhuǎn)與否胀茵。JE即 jump if equal 與CMP結(jié)合使用,當(dāng)比較的結(jié)果相等挟阻,則跳轉(zhuǎn)到指定的地址琼娘;若比較結(jié)果不同,則不跳轉(zhuǎn)附鸽,繼續(xù)執(zhí)行下一條指令脱拼。
看下面這段代碼

CMP AL, 0
JE fin
其實(shí)等價(jià)于

if(AL == 0)
{
goto fin;
}
INT指令 軟件中斷指令,(interrupt)坷备,INT后面是一個(gè)數(shù)字熄浓,使用不同的數(shù)字代表調(diào)用不同的函數(shù),這些函數(shù)都是寫在BIOS中的省撑,方便程序員調(diào)用赌蔑。

HLT指令 這條指令的目的是讓CPU停止動(dòng)作,但不是完全停止竟秫,那樣的話就得斷電娃惯。此處是指讓CPU進(jìn)入待機(jī)狀態(tài)。 玩過linux的同學(xué)應(yīng)該都用過“halt”這條指令進(jìn)行關(guān)機(jī)操作吧肥败。_

結(jié)語

這次介紹匯編還是比較吃力趾浅,畢竟自己明白一些和給別人講解還是不一樣的,不過大家放心啦馒稍,今后的開發(fā)會(huì)轉(zhuǎn)到C語言皿哨,看起來也不會(huì)很吃力,不過必要的時(shí)候還是要用匯編這張“王牌”纽谒,哈哈那么证膨,這次的文章就告一段落了,有些地方說的不對(duì)的佛舱,還請(qǐng)大家提出意見和建議椎例,現(xiàn)行謝過了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挨决,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子订歪,更是在濱河造成了極大的恐慌脖祈,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刷晋,死亡現(xiàn)場(chǎng)離奇詭異盖高,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眼虱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門喻奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捏悬,你說我怎么就攤上這事撞蚕。” “怎么了过牙?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵甥厦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我寇钉,道長(zhǎng)刀疙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任扫倡,我火速辦了婚禮谦秧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撵溃。我一直安慰自己疚鲤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布征懈。 她就那樣靜靜地躺著石咬,像睡著了一般揩悄。 火紅的嫁衣襯著肌膚如雪卖哎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天删性,我揣著相機(jī)與錄音亏娜,去河邊找鬼。 笑死蹬挺,一個(gè)胖子當(dāng)著我的面吹牛维贺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巴帮,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溯泣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虐秋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垃沦,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤客给,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肢簿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靶剑,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年池充,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桩引。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡收夸,死狀恐怖坑匠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卧惜,我是刑警寧澤笛辟,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站序苏,受9級(jí)特大地震影響手幢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忱详,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一围来、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匈睁,春花似錦监透、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糯钙,卻和暖如春粪狼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背任岸。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工再榄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人享潜。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓困鸥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剑按。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疾就,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記厢拭,在此感謝他和像他一樣...
    Gibbs基閱讀 37,198評(píng)論 8 114
  • 計(jì)算機(jī)通過執(zhí)行指令序列來使機(jī)器得以工作兰英,所以對(duì)于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用,這組指令...
    未來科技工作室閱讀 7,994評(píng)論 1 10
  • 王爽匯編全書知識(shí)點(diǎn)大綱 第一章 基礎(chǔ)知識(shí) 機(jī)器語言 匯編語言的產(chǎn)生 匯編語言的組成 存儲(chǔ)器 cpu對(duì)存儲(chǔ)器的讀寫 ...
    2c3ba901516f閱讀 2,417評(píng)論 0 1
  • 這個(gè)程序的核心目的是:試驗(yàn)大地址的讀寫供鸠,在保護(hù)模式下面尋址空間可達(dá)4GB畦贸,實(shí)模式下只能尋址1MB。(why:為什么...
    王偵閱讀 816評(píng)論 0 0
  • 今天受邀去一位朋友那里喝茶看琥珀楞捂,覺察到自己好像無意識(shí)中會(huì)有些焦慮薄坏。從接到邀請(qǐng)開始,我的思緒就開始漂~她邀請(qǐng)我是不...
    596dea33d35b閱讀 265評(píng)論 0 0