我需要調用一些DOS從C/C++程序中斷(服務),我嘗試下面的內聯彙編代碼: (讀取一個字符)如何使用內聯彙編在C/C++程序中調用DOS中斷?
int main()
{
asm(
"movb $0x01, %ah;"
"int $0x21"
);
system("PAUSE");
}
但它沒有工作!我想知道我在這裏做錯了什麼!另外如果有另一種方式來調用dos中斷! 謝謝!
我需要調用一些DOS從C/C++程序中斷(服務),我嘗試下面的內聯彙編代碼: (讀取一個字符)如何使用內聯彙編在C/C++程序中調用DOS中斷?
int main()
{
asm(
"movb $0x01, %ah;"
"int $0x21"
);
system("PAUSE");
}
但它沒有工作!我想知道我在這裏做錯了什麼!另外如果有另一種方式來調用dos中斷! 謝謝!
你只能在DOS程序中使用DOS中斷,所以要做到這一點,你需要一個真正古老的C++編譯器,比如Visual C++ 1.0或1.5,或者Turbo C++/Borland C++,通過類似4.5或者5.0 。然後你必須修復你的彙編代碼 - 你寫的代碼看起來像AT語法,但是我知道的所有DOS編譯器都使用Intel語法。有一個例外:djgcc。這是一個在DOS擴展器下運行的gcc的古老版本,因此它使用AT語法,並且仍然支持一組DOS類中斷(儘管你真的使用DOS擴展器,而不是DOS本身)。即使如此,該程序也只能運行在支持DOS程序的系統上(並且微軟正在迅速從Windows中刪除它 - 例如,它在所有x64版本的Windows中都不存在)。
DOS已經過時足夠長時間,因此爲它編寫新代碼沒有任何意義。如果你想讀取這樣的密鑰,編寫一個Windows程序,並使用ReadConsoleInput
等代替。
編輯:好的,如果你真的想這樣做,顯而易見的方法是選擇一個DOS extender並將當前版本的gcc移植到它。另一種可能性是選擇一個編譯器,如OpenWatcom或Digital Mars,它仍然保留並已移植到DOS extender。
我仍然會不時看到使用FreeDOS的新項目(http://www.freedos.org/)。我記得的最後一個是飛行模擬器中的控制裝載機。 – 2010-04-26 19:56:50
@Judge Maygarden:我看到很多我不相信的東西。公平地說,我認爲一個DOS程序在*有限的情況下可能是有意義的 - 雖然是非正式的,但我能想到的唯一一個是一個硬實時系統,它無法承受Windows不可預測的時間。即使如此,它仍然值得懷疑 - 有比DOS更好的RT/OS。 – 2010-04-26 20:02:13
這是一個實時系統,但我承認我認爲這是愚蠢的,當我看到它。儘管FreeDOS的「免費」部分與VxWorks,RedHawk,LynxOS等相比具有吸引力。 – 2010-04-26 20:13:09
您能詳細說明「它沒有用嗎?」它編譯了嗎?它崩潰了嗎?它運行了,但沒有達到預期效果? – 2010-04-26 19:51:08
我對INT 21h函數01h的理解是它應該從標準輸入(阻塞直到有一個可用)讀取一個字符並將其返回到AL寄存器中。 – 2010-04-26 20:18:59
對不起,詳細信息! 我使用代碼塊作爲IDE(所以編譯器是GCC),這段代碼編譯得很好,但執行後它會在一兩秒鐘後產生一個錯誤,代碼如下:0xc0000005, 我的平臺是intel x86上的Windows XP, 謝謝。 – Rockr90 2010-04-26 20:21:58