2010-04-26 57 views
2

我需要調用一些DOS從C/C++程序中斷(服務),我嘗試下面的內聯彙編代碼: (讀取一個字符)如何使用內聯彙編在C/C++程序中調用DOS中斷?

int main() 
{ 
asm(
"movb $0x01, %ah;" 
"int $0x21" 
); 
system("PAUSE"); 
} 

但它沒有工作!我想知道我在這裏做錯了什麼!另外如果有另一種方式來調用dos中斷! 謝謝!

+4

您能詳細說明「它沒有用嗎?」它編譯了嗎?它崩潰了嗎?它運行了,但沒有達到預期效果? – 2010-04-26 19:51:08

+0

我對INT 21h函數01h的理解是它應該從標準輸入(阻塞直到有一個可用)讀取一個字符並將其返回到AL寄存器中。 – 2010-04-26 20:18:59

+0

對不起,詳細信息! 我使用代碼塊作爲IDE(所以編譯器是GCC),這段代碼編譯得很好,但執行後它會在一兩秒鐘後產生一個錯誤,代碼如下:0xc0000005, 我的平臺是intel x86上的Windows XP, 謝謝。 – Rockr90 2010-04-26 20:21:58

回答

9

你只能在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移植到它。另一種可能性是選擇一個編譯器,如OpenWatcomDigital Mars,它仍然保留並已移植到DOS extender

+1

我仍然會不時看到使用FreeDOS的新項目(http://www.freedos.org/)。我記得的最後一個是飛行模擬器中的控制裝載機。 – 2010-04-26 19:56:50

+0

@Judge Maygarden:我看到很多我不相信的東西。公平地說,我認爲一個DOS程序在*有限的情況下可能是有意義的 - 雖然是非正式的,但我能想到的唯一一個是一個硬實時系統,它無法承受Windows不可預測的時間。即使如此,它仍然值得懷疑 - 有比DOS更好的RT/OS。 – 2010-04-26 20:02:13

+0

這是一個實時系統,但我承認我認爲這是愚蠢的,當我看到它。儘管FreeDOS的「免費」部分與VxWorks,RedHawk,LynxOS等相比具有吸引力。 – 2010-04-26 20:13:09

0

您可能需要x86仿真器(如DOSBox)才能在Windows XP下運行此代碼。

+0

試過了!但它不運行,而是打印一條消息,說「本程序無法在dos模式下運行」不明白問題出在哪裏! 謝謝 – Rockr90 2010-04-26 20:54:03

+0

您需要使用上面提到的廢棄編譯器構建代碼,然後在DOSBox或較舊的操作系統下運行它。 – phkahler 2010-04-26 21:32:11

相關問題