操作系統實驗五:保護模式之初步認知門任務(求助:如何使用其他指令替代或模擬retf指令)

向彙編高手求助:

      此次實驗中需要用到retf指令在調用門任務後返回。可是yc09編譯器不支持retf指令。而我使用ret指令無法正確跳轉返回。

      因爲對彙編不熟,胡亂試了許多方法後依然無法解決,無奈之下,只好在編譯好代碼後直接修改機器指令碼。希望有路過的高手、大牛等告說我在不換編譯器的前提下如何解決這問題。

 

使用retf指令報錯信息:

      pm32.c(123) : error C2065: 'retf' : undeclared identifier  --209

 

百度了一下,有人解釋說ret與retf的區別如下。

ret   ->  pop ip
retf  ->  pop ip
             pop cs

 

      我試着用 pop ip  與 pop cs 代替retf,編譯器卻對這兩個指令報錯。

報錯信息:

      pm32.c(123) : error C2065: 'ip' : undeclared identifier  --205
      pm32.c(124) : error C4606: impossible combination of opcode and oprands

 

此次實驗內容:在保護模式下,根據在GDT註冊好的門任務,無特權轉換的跳轉到門任務下,打印一條信息後返回。

 

使用門任務步驟:

     1.編寫一個爲測試門任務而是用的測試函數,功能爲顯示一個字符串。(編寫好後最好測試一下知否能直接調用)

     2.在GDT上註冊好門任務:需要設置 選擇子、偏移量、參數個數、屬性  這4個參數。

     (因爲門任務與GDT的數據結構不相同,所以需要在pm.h裏新定義一個宏函數。)

     3.定義一個選擇子指向GDT中註冊的門任務。

     4.在保護模式下,使用call通過門任務選擇子調用門任務。

 

實驗代碼如下:

 

code:run.c(新增一個修改ret爲retf機器指令的函數:void ret_To_retf(byte *imgBuffer,int size),並在CompileFile函數調用)

 

 

 

code:pm.h(新增了一個宏(Gate),在pm32.c中GDT用到)

 

 

code:pm16.c

 

code:pm32.c

 

想要實驗以上代碼的朋友請注意:

 

 

 

1.到楊曉兵大大的博客上下載安裝yc09編譯器,安裝只需一分鐘左右。

2.將此次試驗中的run.c、pm.h、pm16.cpm32.c代碼拷貝到某個實驗用的文件夾內。

3.在安裝yc09的目錄YC09/example文件夾內找到bochs.exe、BIOS-bochs-latest、VGABIOS-elpin-2.40、x11-pc-us.map四個文件拷貝到試驗用的文件夾內。

4.使用yc09編譯運行run.c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章