任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36
任務和特權級保護(五)——《x86匯編語言:從實模式到保護模式》讀書筆記36
修改后的代碼,有需要的朋友可以去下載(c14_new文件夾)。下載地址是:
GitHub: https://github.com/LeslieChe/from-real-mode-to-protected-mode
第14章的習題2及解答
修改代碼清單14-1和13-3,使得通過調用門請求讀取硬盤扇區的服務時,通過棧傳遞參數。而且,傳遞的參數分別是邏輯扇區號、數據段選擇子和段內偏移。要求使用ARPL指令。
注意,題目中的“數據段選擇子”,不一定非得是DS,其他的指向數據段的段寄存也是可以的。
關于ARPL指令,可以參考我的博文
RPL的故事 ——《x86匯編語言:從實模式到保護模式》讀書筆記31
下面僅解釋這道題最關鍵的部分:對棧中參數的提取和ARPL指令的使用。
read_hard_disk_0: ;從硬盤讀取一個邏輯扇區;---------------;| 邏輯扇區號 |@1;---------------;|數據段選擇子 |@2;---------------;| 段內偏移 |@3;---------------;| | CS |;---------------;| EIP |;---------------;| 8個寄存器 |;---------------;| | DS |;-------------- <-----EBP;| |pushad push dsmov ebp,esp因為是用棧傳遞參數,在執行完上面三行后,棧的示意圖如上圖所示。
mov ax,[ebp+10*4] ;提取調用者的CSmov bx,[ebp+12*4] ;提取 @2數據段選擇子arpl bx,ax ;調整段選擇子的 RPLmov ds,bxmov eax,[ebp+13*4];提取 @1邏輯扇區號mov ebx,[ebp+11*4];提取 @3段內偏移push eax ;因為后面的端口操作要用到 AL,所以先壓棧保存扇區號接下來的代碼和配書源碼基本相同,除了最后3行。
loop .readwpop dspopad retf 3*4 ;段間返回用棧傳遞參數
除了上面的修改,我還把所有例程都改成了用棧來傳遞參數(如果需要傳參的話)。
首先,要修改例程本身,這個與上面的習題類似,這里不再贅述。
其次,要修改調用門描述符中的參數個數字段。
為此,我修改了內核的符號表,在每個表項后面增加了參數個數字段(如下圖)。如果不需要傳遞參數,那么這個字段應該填寫0.這樣做是為了在安裝調用門的時候,可以方便地獲得參數個數。
光在符號表中添加參數個數字段是不行的,我們還要修改安裝調用門的代碼,只需要增加下圖中紅色的那行。
為put_string增加顏色支持
我對五彩繽紛的字符情有獨鐘,所以為put_string例程增加了顏色支持。
最后運行結果如下圖所示:
用%include包含文件
類似在C語言源文件中用#include "XXX.h"包含其他文件, 在.asm源文件中也可以使用
%include "xxxxx"例如在一個源文件中寫了一句:
%include "macros.mac"這會把文件macros.mac中的內容包含到現在的源文件中。用nasm編譯文件的時候,會在當前目錄下尋找被包含的文件,也可以在nasm命令行使用-i選項來增加搜索路徑。
因為增加了顏色支持,為了方便,我把一些字符屬性的值專門放在了“color.inc”文件中。
; define some colorsGREEN EQU 0X02 BLUE EQU 0X09 RED EQU 0X04 YELLOW EQU 0X0E那么引用這些符號常量(如GREEN)的時候,就需要用%include把這個文件包含進來。
第14章的學習筆記就到這里,下次我們開始第15章的學習。敬請關注…
總結
以上是生活随笔為你收集整理的任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计一个4*4魔方程序,让魔方的各行值的
- 下一篇: python 异常分类_Python异常