2014-01-15 77 views
0

記得使用稱爲C++:調用BIOS中斷爲0x21

geninterrupt(int interrupt_no) 

功能(包括在dos.h),以顯示在渦輪C++在屏幕上的字符串。現在,當我嘗試用g ++編譯相同的程序時,編譯器向我大喊。

C:\Users\Krish\Documents\rough.cpp|7|error: '_AH' was not declared in this scope| 
C:\Users\Krish\Documents\rough.cpp|8|error: '_DX' was not declared in this scope| 
C:\Users\Krish\Documents\rough.cpp|9|error: 'geninterrupt' was not declared in this scope| 

看來它甚至沒有識別寄存器。我究竟做錯了什麼。這些函數不是C++標準庫的一部分嗎? (我應該明確鏈接庫?)。如果是的話如何?

+0

不,這完全是特定於平臺。您可以使用內聯彙編程序來調用x86風格的中斷。無論如何,這不是在現代操作系統中顯示字符串的方式,它只能在實模式下工作。 – Erbureth

+3

如果該函數在'dos.h'中,那就暗示你知道它是DOS特定的而不是標準的。 – Shahbaz

+0

由於這個問題是*高度*平臺特定的,應該更具體地標記它。 –

回答

3

調用中斷以獲取打印的字符串僅在x86兼容的CPU上工作real mode(DOS下運行)。現代操作系統在protected mode中工作,其中BIOS中斷不再可用。

今天,控制檯輸出通常用file handle表示,您可以使用標準庫發送數據,或者如果要執行低級別直接內核功能,則可以使用標準庫發送數據。 (在POSIX系統調用的是write

Linux System Call table可以使用int 0x80sys_write可用(您需要使用內聯彙編,以填補參數並調用中斷)

+0

我希望有人早些時候告訴我這件事,感謝隊友。如果我在16位環境(dos框)中模擬一個turbo C++程序,我仍然能夠訪問像win 8這樣的現代操作系統中的中斷。 – krish

+0

@krish:當然!如果你使用DosBox,你將擁有大部分老'不錯的BIOS和MS-DOS功能。但是你將不得不使用MS-DOS編譯器來構建你的程序!看看'DJGPP'(http://www.delorie.com/djgpp/)。但我的建議是提升你的知識,忘記舊的方式。自上次MS-DOS版本已經有20年了! – rodrigo