向彙編高手求助:
此次實驗中需要用到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.c、pm32.c代碼拷貝到某個實驗用的文件夾內。
3.在安裝yc09的目錄YC09/example文件夾內找到bochs.exe、BIOS-bochs-latest、VGABIOS-elpin-2.40、x11-pc-us.map四個文件拷貝到試驗用的文件夾內。
4.使用yc09編譯運行run.c