2010-03-01 15 views
6

Ecco il codice:Perché il mio programma masm32 si arresta in modo anomalo ogni volta che provo a utilizzare gli interrupt?

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

Risultato: http://img705.imageshack.us/img705/3738/resultom.png

"test.exe ha smesso di funzionare" - ha sempre ragione quando raggiunge l'interrupt.

This is the interrupt I'm trying to use. Dovrebbe semplicemente uscire dal programma. Altri che ho provato includono input/output di caratteri, ecc. Niente funziona.

Sono su Windows 7, utilizzando masm32 con l'IDE WinAsm.

Ci sono così tante cose interessanti che dovrebbe essere in grado di fare con gli interrupt ... tuttavia, si blocca ogni volta che provo a usare un'interruzione - sempre allo stesso modo.

Questo sembra correlate ed eventualmente utili: DOS Interrupt in masm x86 assembly crashing

... ma non ho davvero stato in grado di capire nulla fuori da esso.

Qualche suggerimento?

risposta

5

Sì. Gli interrupt di questa natura sono specifici per MS-DOS e, come tale, funzionano in Windows ME e precedenti ma non funzioneranno sull'architettura NT, tranne sotto l'emulatore DOS (command.com). Non ho idea se questo ancora viene fornito con Windows 7 - so che le versioni x64 di Windows non ce l'hanno per impostazione predefinita.

Se stai scrivendo Native NT Apps (è improbabile che tu lo stia facendo se non sai qual è, ma se vuoi scoprire dare un'occhiata a Blog di Mark Russinovich su MSDN) ecco un elenco degli interrupt NT e le loro funzioni corrispondenti: http://www.ctyme.com/intr/rb-4249.htm

oltre a questo, si vuole chiamare una funzione in API Win32: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Edit: e in questo esempio di codice, non hai specificato alcuna opzione per l'interruzione, fatta attraverso i registri. Oh e potresti farlo funzionare a condizione di assemblare per DOS e non per Windows. Se utilizzi un linker probabilmente creerai un eseguibile di Windows PE. Tuttavia, se sei su Windows a 64 bit, come ho detto, non provarci.

Una cosa che si potrebbe fare è installare un sistema di macchina virtuale come VirtualBox o VMware e quindi installare FreeDOS. Non dovrebbe occupare molta RAM e ti permetterà di sperimentare liberamente assembly/dos.

+0

Grazie Ninefingers, immagino che abbia senso. Guarderò sicuramente in una VM, probabilmente è una buona idea! Inoltre, l'interrupt che stavo usando non prende alcuna opzione (non penso comunque), quindi non sarebbe un problema. – Cam

2

Oltre alla risposta eccellente di @ninefingers - posso aggiungere l'int 20H funzionerà solo con programmi a 16 bit. E non può mai essere utilizzato da un .exe

Vedere here.

2

È necessario prestare attenzione agli interrupt di programmazione. Se ci si trova in una posizione diversa da RealMode (16 bit), in genere non è possibile raggiungere gli interrupt a livello della CPU. Una tabella descrittore di interrupt deve essere disponibile per l'indicizzazione della tabella vettoriale di interrupt.

L'IVT si trova in Ring 0, dove si ha accesso diretto e senza ostacoli all'hardware (CPU, video, ecc.) Tutte le applicazioni verranno eseguite in Ring 3 (sistema operativo incluso). L'IDT contiene indici per l'IVT. Questo è fatto per proteggere il tuo hardware. Se si desidera accedere agli interrupt dal sistema operativo, è necessario assicurarsi che siano disponibili per la sorgente a 32 bit.

0

Sotto Windows a 32 bit esiste una modalità 86 virtuale e con questa modalità è possibile utilizzare gli interrupt del software RM meno recenti da DOS, poiché Windows emula molti di essi. Inoltre, se abbiamo installato correttamente un driver per la nostra grafikcard, allora è possibile utilizzare alcuni degli interrupt software int hh, esempio per ottenere il vesamodelist di un vesabios sulla nostra scheda. Sì, è un'emulazione, ma ottiene i modenumeri reali ei loro parametri ambientali dalla nostra scheda, anche se la modifica di tutti quei vesamodi è impossibile in Windows.

Un'applicazione DOS a 16 bit può anche utilizzare il formato * .exe, ma questo è un formato MZ, non un formato PE.

Dirk

Problemi correlati