x86 從實模式到保護模式 學(xué)習(xí)筆記(1)


第五章 編寫主引導(dǎo)扇區(qū)代碼

本章介紹了一個簡短的主引導(dǎo)扇區(qū)代碼屈梁,其主要功能是在屏幕上顯示“l(fā)abel offset”腋逆,并顯示一個標號的物理地址。

如何在屏幕上顯示

在主引導(dǎo)扇區(qū)階段, 0xB8000-0xBFFFF這段物理地址對應(yīng)的內(nèi)存是留給顯卡的畜份,每屏2000個字符办素,按順序存放在這段空間里角雷。所以我們想要在屏幕上輸出,就要改寫這段內(nèi)存性穿。

    mov ax,0xb800                 ;指向文本模式的顯示緩沖區(qū)
    mov es,ax                     ;以下顯示字符串"Label offset:"
    mov byte [es:0x00],'L'
    mov byte [es:0x01],0x07

這段代碼主要用于改寫0xB8000位置的第一個字符表示區(qū)域勺三,先把0xb800放入寄存器es中,然后以es作為基地址載入L的ASC碼需曾,最后輸入8bit顏色信息吗坚。總共使用16bit顯示一個字符呆万。

將標號地址輸出到屏幕上

下一步想要保存一個標號的物理地址商源,首先我們獲得這個標號的地址:

    mov ax,number                 ;取得標號number的偏移地址
    mov bx,10

然后分別求每一位的地址:

    ;設(shè)置數(shù)據(jù)段的基地址
    mov cx,cs
    mov ds,cx

    ;求個位上的數(shù)字
    mov dx,0
    div bx
    mov [0x7c00+number+0x00],dl   ;保存?zhèn)€位上的數(shù)字

需要注意的是,在做16位除法時谋减,被除數(shù)的高8位需要保存在寄存器dx中牡彻,低8位需要保存在ax中,做完除法后出爹,商保存在ax中庄吼,余數(shù)保存在dx中。
接下來,我們把存好的十進制數(shù)輸出到顯示屏上:

    ;以下用十進制顯示標號的偏移地址
    mov al,[0x7c00+number+0x04]
    add al,0x30
    mov [es:0x1a],al
    mov byte [es:0x1b],0x04

最后严就,使程序進入無限循環(huán)总寻,并且補充主引導(dǎo)扇區(qū)到512字節(jié),并補充結(jié)尾標志:0x55AA

    infi: jmp near infi                 ;無限循環(huán)
      
    number db 0,0,0,0,0
  
    times 203 db 0
              db 0x55,0xaa

本章的代碼解讀就到這里梢为,后面有一些調(diào)試相關(guān)的內(nèi)容渐行,不在此贅述

一個小問題

代碼中設(shè)置了數(shù)據(jù)段基地址,但是卻沒有用到铸董,這是因為什么祟印?跟全局描述符表有關(guān)系么?

第六章 相同的功能袒炉,不同的代碼

本章主要介紹了顯示上一章講述內(nèi)容的不同實現(xiàn)方法

打印label offset

    jmp near start
     
mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
        'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
number db 0,0,0,0, 0

start:
     mov ax,0x7c0                  ;設(shè)置數(shù)據(jù)段基地址 
     mov ds,ax
     
     mov ax,0xb800                 ;設(shè)置附加段基地址 
     mov es,ax
     
     cld
     mov si,mytext                 
     mov di,0
     mov cx,(number-mytext)/2      ;實際上等于 13
     rep movsw

本章節(jié)使用的方法是把要打印的內(nèi)容直接存在內(nèi)存當中旁理,然后把數(shù)據(jù)段直接搬運到顯示數(shù)據(jù)段。
內(nèi)容較好理解我磁,需要注意的是movsw可以從[ds:si]把數(shù)據(jù)搬運到[es:di]中去孽文,cld則是方向標志位清零指令,代表由低地址向高地址的方向傳送數(shù)據(jù)夺艰,若方向標志位為1芋哭,則相反。同時rep movsw則表示“repeat”執(zhí)行movsw郁副,直到CX寄存器為0减牺。每次執(zhí)行movsw,CX寄存器自動減一。

把標號地址存儲為十進制

    ;得到標號所代表的偏移地址
    mov ax,number
    
    ;計算各個數(shù)位
    mov bx,ax
    mov cx,5                      ;循環(huán)次數(shù) 
    mov si,10                     ;除數(shù) 
digit: 
    xor dx,dx
    div si
    mov [bx],dl                   ;保存數(shù)位
    inc bx 
    loop digit

本章使用了循環(huán)來把標號地址轉(zhuǎn)換為十進制拔疚。代碼也十分簡單肥隆,不贅述。
小tips:把number地址保存到ax中時稚失,number地址存在哪里呢栋艳?需要占用內(nèi)存空間么?事實上句各,mov ax, number這條指令翻譯成機器碼后吸占,number的地址是直接寫入到這條指令中的,事實上這條指令是一條載入立即數(shù)的指令凿宾,而不是一眼看上去的寄存器之間的指令矾屯。

把標號地址輸出到顯示器并無限循環(huán)

    ;顯示各個數(shù)位
    mov bx,number 
    mov si,4                      
show:
    mov al,[bx+si]
    add al,0x30
    mov ah,0x04
    mov [es:di],ax
    add di,2
    dec si
    jns show
    
    mov word [es:di],0x0744

    jmp near $

同樣的,運用循環(huán)的方法把數(shù)據(jù)搬運到顯示區(qū)域初厚,那么為什么不仍然使用movsw指令把它們傳輸過去呢件蚕?由于我們的高地址位存放的是十進制中的高位,而去顯示的時候則需要地址位存放十進制的高位惧所,所以無論是正向還是反向傳輸數(shù)據(jù)都不能滿足我們的需求骤坐,這時候就需要我們自己來實現(xiàn)這個功能了绪杏。

代碼中出現(xiàn)了[bx+si]基址+變址的尋址方式下愈,支持這種尋址方式的摯友一下四種:

[bx+si]
[bx+di]
[bp+si]
[bp+di]

其他的方式都不支持。最后蕾久,我們通過jns show這條指令來保證循環(huán)的正確執(zhí)行势似。jns這條指令在符號標志位(SF)為0時跳轉(zhuǎn),為1時不跳轉(zhuǎn)僧著。而dec指令會改變符號標志位履因,所以在si減為0后再次執(zhí)行時,si減為0xffff盹愚,改變了符號標志位栅迄,結(jié)束了循環(huán)。

最后皆怕,輸出了字符D并開始無限循環(huán)毅舆。

最終的結(jié)束區(qū)域使用$符號計算出需要填寫0的數(shù)量,并寫入愈腾,然后寫入結(jié)束標志0x55AA

times 510-($-$$) db 0
                 db 0x55,0xaa
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憋活,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子虱黄,更是在濱河造成了極大的恐慌悦即,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辜梳,居然都是意外死亡粱甫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門作瞄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魔种,“玉大人,你說我怎么就攤上這事粉洼〗谠ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵属韧,是天一觀的道長安拟。 經(jīng)常有香客問我,道長宵喂,這世上最難降的妖魔是什么糠赦? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锅棕,結(jié)果婚禮上拙泽,老公的妹妹穿的比我還像新娘。我一直安慰自己裸燎,他們只是感情好顾瞻,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著德绿,像睡著了一般荷荤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上移稳,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天蕴纳,我揣著相機與錄音,去河邊找鬼个粱。 笑死古毛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的都许。 我是一名探鬼主播稻薇,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梭稚!你這毒婦竟也來了颖低?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弧烤,失蹤者是張志新(化名)和其女友劉穎忱屑,沒想到半個月后蹬敲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡莺戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年伴嗡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片从铲。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘪校,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出名段,到底是詐尸還是另有隱情阱扬,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布伸辟,位于F島的核電站麻惶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏信夫。R本人自食惡果不足惜窃蹋,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望静稻。 院中可真熱鬧警没,春花似錦、人聲如沸振湾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恰梢。三九已至佛南,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嵌言,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工及穗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摧茴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓埂陆,卻偏偏與公主長得像苛白,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子焚虱,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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