[025][x86匯編語言]第十三章 學(xué)習(xí)用戶程序 c13.asm

學(xué)習(xí)筆記

《x86匯編語言:從實(shí)模式到保護(hù)模式》
http://www.reibang.com/p/d481cb547e9f

第十三章的 代碼

  • 用戶程序 c13.asm 代碼行數(shù)81行
  • 內(nèi)核程序 c13_core.asm 代碼行數(shù)601行
  • 加載程序 c13_mbr.asm 代碼行數(shù)221行

加載程序 c13_mbr.asm

http://www.reibang.com/p/49cbc4161799

調(diào)用過程

  • 1、內(nèi)核程序 分配內(nèi)存
  • 2、內(nèi)核程序 讀取、加載用戶程序
  • 3浇雹、內(nèi)核程序 轉(zhuǎn)移CPU控制權(quán)給用戶程序
  • 4、用戶程序 執(zhí)行
  • 5已球、用戶程序 返回到 內(nèi)核程序
  • 6韧掩、內(nèi)核程序 執(zhí)行象浑,最終進(jìn)入停機(jī)狀態(tài)
內(nèi)核程序 用戶程序 調(diào)用全過程.png

內(nèi)存布局示意圖

內(nèi)存布局示意圖.png

運(yùn)行結(jié)果

運(yùn)行結(jié)果 標(biāo)注各部分顯示信息來源.png

代碼使用

配書工具 :
編譯工具 nasmide.exe
寫扇區(qū)工具 fixvhdwr.exe

  • 1、編譯加載程序 c13_mbr.asm句携,生成二進(jìn)制文件c13_mbr.bin榔幸,將c13_mbr.bin文件寫入虛擬硬盤的LBA邏輯扇區(qū)0號(hào)
  • 2、編譯內(nèi)核程序 c13_core.asm削咆,生成二進(jìn)制文件c13_core.bin牍疏,將c13_core.bin文件寫入虛擬硬盤的LBA邏輯扇區(qū)1號(hào)
  • 3拨齐、編譯用戶程序 c13.asm鳞陨,生成二進(jìn)制文件 c13.bin,將 c13.bin文件寫入虛擬硬盤的LBA邏輯扇區(qū)50號(hào)瞻惋;
  • 4厦滤、將數(shù)據(jù)文件diskdata.txt寫入虛擬硬盤LBA邏輯扇區(qū)100號(hào)

完整源碼(用戶程序歼狼,增加注釋)

;代碼清單13-3
;文件名:code_13.asm
;文件說明:用戶程序
;創(chuàng)建日期:18:23 2018/6/3

;===========================================================
SECTION header vstart=0
    program_length  dd program_end  ;程序總長(zhǎng)度#0x00
    
    head_len        dd header_end   ;程序頭部的長(zhǎng)度#0x04
    
    stack_seg       dd 0            ;用于接收堆棧段選擇子#0x08
    stack_len       dd 1            ;程序建議的堆棧大小#0xc
    
    
    prgentry        dd start                ;程序入口地址#0x10
    code_seg        dd section.code.start   ;代碼段位置#0x14
    code_len        dd code_end             ;代碼段長(zhǎng)度#0x18
    
    
    data_seg        dd section.data.start   ;數(shù)據(jù)段位置#0x1c
    data_len        dd data_end             ;數(shù)據(jù)段長(zhǎng)度#0x20

;------------------------------------------------------------
    ;符號(hào)地址檢索表
    salt_items      dd (header_end - salt)/256  ;#0x24
    
    salt:
    PrintString     db  '@PrintString'
                    times 256-($-PrintString) db 0
                    
    TerminateProgram db '@TerminateProgram'
                     times 256-($-TerminateProgram) db 0
    
    ReadDiskData     db '@ReadDiskData'
                     times 256-($-ReadDiskData) db 0

    header_end:
    
;===========================================================
SECTION data vstart=0

        buffer times 1024 db 0  ;緩沖區(qū)
        
        message_1       db 0x0d,0x0a,0x0d,0x0a
                        db '**********User program is runing**********'
                        db 0x0d,0x0a,0
        message_2       db 'Disk data:',0x0d,0x0a,0

data_end:

;===========================================================
    [bits 32]
;===========================================================
SECTION code vstart=0
start:
    mov eax,ds          ;ds此時(shí)指向用戶程序頭部段
    mov fs,eax      
    
    mov eax,[stack_seg]
    mov ss,eax
    mov esp,0
    
    mov eax,[data_seg]
    mov ds,eax
    
    mov ebx,message_1
    call far [fs:PrintString]
    
    mov eax,100                     ;源地址:數(shù)據(jù)文件放在硬盤LBA邏輯扇區(qū)號(hào)100處
    mov ebx,buffer                  ;目的地址:緩沖區(qū)偏移地址
    call far [fs:ReadDiskData]      ;段間調(diào)用:讀扇區(qū)
    
    mov ebx,message_2
    call far [fs:PrintString]
    
    mov ebx,buffer
    call far [fs:PrintString]
    
    jmp far [fs:TerminateProgram]   ;將CPU控制權(quán)返回到內(nèi)核程序
    
code_end:

;===========================================================
SECTION trail
;-----------------------------------------------------------
program_end:    

代碼說明

4-3 將描述符的選擇子回寫到用戶程序頭部段

內(nèi)核程序回寫 用戶程序各個(gè)段的段選擇子.png

6 重定位用戶程序的SALT表

將內(nèi)核程序C-SALT表中的6字節(jié)入口地址 回寫到 用戶程度U-SALT表中.png

當(dāng)CPU轉(zhuǎn)到用戶程序代碼段開始執(zhí)行時(shí)掏导,DS寄存器指向的是用戶程序頭部段

這是由于 內(nèi)核程序 調(diào)用 load_relocate_program 的最后
會(huì)傳遞一個(gè)返回參數(shù)到寄存器AX   mov ax,[es:0x04]
此時(shí)的 [es:0x04]指向的正是 用戶程序的head_len 標(biāo)號(hào)處
在經(jīng)歷過 步驟 4-3 的段選擇子回寫之后,這個(gè)標(biāo)號(hào)現(xiàn)在存的就是 指向用戶程序頭部段的段選擇子
借由AX寄存器做一個(gè)返回參數(shù)

之后羽峰,內(nèi)核程序又通過  mov ds,ax 將這個(gè)值傳遞給ds
緊隨其后的是 一條跳轉(zhuǎn)指令 轉(zhuǎn)移CPU控制權(quán)給 用戶程序
 mov ds,ax 
 jmp far [0x10]   

因此趟咆,在用戶程序真正開始執(zhí)行的時(shí)候,DS寄存器 恰恰指向用戶程序的頭部段梅屉。
DS寄存器指向的是用戶程序頭部段
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忍啸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子履植,更是在濱河造成了極大的恐慌,老刑警劉巖悄晃,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玫霎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妈橄,警方通過查閱死者的電腦和手機(jī)庶近,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眷蚓,“玉大人鼻种,你說我怎么就攤上這事∩橙龋” “怎么了叉钥?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)篙贸。 經(jīng)常有香客問我投队,道長(zhǎng),這世上最難降的妖魔是什么爵川? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任敷鸦,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扒披。我一直安慰自己值依,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布碟案。 她就那樣靜靜地躺著愿险,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟆淀。 梳的紋絲不亂的頭發(fā)上拯啦,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音熔任,去河邊找鬼褒链。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疑苔,可吹牛的內(nèi)容都是我干的甫匹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼惦费,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兵迅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起薪贫,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤恍箭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞧省,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扯夭,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鞍匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了交洗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橡淑,死狀恐怖构拳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梁棠,我是刑警寧澤置森,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站掰茶,受9級(jí)特大地震影響暇藏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜濒蒋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一盐碱、第九天 我趴在偏房一處隱蔽的房頂上張望把兔。 院中可真熱鬧,春花似錦瓮顽、人聲如沸县好。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缕贡。三九已至,卻和暖如春拣播,著一層夾襖步出監(jiān)牢的瞬間晾咪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工贮配, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谍倦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓泪勒,卻偏偏與公主長(zhǎng)得像昼蛀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圆存,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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