2010-03-01 52 views
6

下面的代碼:當我嘗試使用中斷時,爲什麼我的masm32程序崩潰?

.386 ;target for maximum compatibility 
.model small,stdcall ;model 
.code 
    main: 
     int 20h 
    END main 

結果:http://img705.imageshack.us/img705/3738/resultom.png

「test.exe的已停止工作」 - 當它到達中斷總是正確的。

This is the interrupt I'm trying to use.它應該簡單地退出程序。其他我已經嘗試過包括字符輸入/輸出等。沒有任何工作。

我在Windows 7中,使用masm32和WinAsm IDE。

看起來我應該可以用中斷來做很多很酷的事情......但是,每當我嘗試使用中斷時都會崩潰 - 總是以相同的方式。

這似乎是相關的,可能有用的:DOS Interrupt in masm x86 assembly crashing

...但我還沒有真正能夠從中計算出任何東西。

有什麼建議嗎?

回答

5

是的。這種性質的中斷是專門針對MS-DOS的,因此在Windows ME和以前的版本中工作,但在DOS體系結構(command.com)下除NT體系結構外無法工作。我不知道這是否仍然與Windows 7一起發佈 - 我知道Windows的x64版本默認情況下沒有。

如果你正在編寫Native NT應用程序(如果你不知道它是什麼,你不太可能這樣做,但是如果你想知道在MSDN上看看Mark Russinovich的博客),這裏有一個NT中斷及其相應的功能列表:http://www.ctyme.com/intr/rb-4249.htm

除此之外,你要調用一個函數在Win32 API:http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

編輯:和代碼示例,你沒有指定任何選項中斷,通過寄存器完成。哦,你可以讓它工作,只要你爲DOS組裝而不是Windows組裝。如果你使用鏈接器,你可能會創建一個Windows PE可執行文件。但是,如果您使用64位Windows,正如我所說的那樣,請不要嘗試。

你可以做的一件事就是安裝一個虛擬機系統,如VirtualBox或VMware,然後安裝FreeDOS。它不應該佔用太多RAM,並且可以讓您自由地嘗試組裝/操作。

+0

謝謝Ninefingers,我想這是有道理的。我一定會研究虛擬機,這可能是一個好主意!此外,我使用的中斷沒有采取任何選擇(我不認爲),所以這不成問題。 – Cam 2010-03-01 06:44:01

2

除了@ninefingers優秀的答案 - 我可以添加int 20H將只適用於16位程序。並且永遠不能使用.exe

請參閱here

2

你必須小心編程中斷。如果您使用RealMode(16位)以外的任何其他功能,則通常無法在CPU級別達到中斷。中斷描述符表必須可用於索引中斷向量表。

IVT位於Ring 0,您可以直接無障礙地訪問硬件(CPU,視頻等)。所有應用程序都將在Ring 3(包括OS)中運行。 IDT包含IVT的索引。這是爲了保護你的硬件。如果你想從操作系統訪問中斷,你需要確保它們可用於你的32位源。

0

在32位Windows下有一個虛擬86模式,使用這種模式可以使用DOS中較老的RM軟件中斷,因爲Windows模擬了很多這種模式。 此外,如果我們已經爲我們的grafikcard正確安裝了驅動程序,那麼可以使用一些int 10h軟件interupts,例如獲取我們卡上的vesabios的vesamodelist。是的,它是一種模擬,但它可以從我們的卡上獲得真實的modenumbers和它們的環境參數,如果在windows下不可能更改所有這些vesamodes。

16位DOS應用程序也可以使用* .exe格式,但這是MZ格式,而不是PE格式。

Dirk

相關問題