2010-03-01 5 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. Он должен просто выйти из программы. Другие, которые я пробовал, включают ввод/вывод символов и т. Д. Ничего не работает.

Я нахожусь в окнах 7, используя masm32 с IDE WinAsm.

Есть так много классных вещей, что кажется, что я могу быть в состоянии сделать с прерываниями ... однако, он падает каждый раз, когда я пытаюсь использовать прерывание - всегда одинаково.

Это кажется связаны и, возможно, полезно: DOS Interrupt in masm x86 assembly crashing

... но я на самом деле не был в состоянии понять что-либо из него.

Любые предложения?

ответ

5

Да. Прерывания такого рода специально предназначены для MS-DOS, и как таковые работали в Windows ME и ранее, но не будут работать над архитектурой NT, кроме как под эмулятором DOS (command.com). Я понятия не имею, если это все еще поставляется с Windows 7 - я знаю, что x64 версии Windows не имеют его по умолчанию.

Если вы пишете Native NT Apps (вряд ли вы это сделаете, если не знаете, что это такое, но если вы хотите узнать, как блог Маркса Руссиновича в MSDN), список прерываний NT и соответствующие им функции: http://www.ctyme.com/intr/rb-4249.htm

кроме этого, вы хотите, чтобы вызвать функцию в Win32 API: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Edit: и в этом примере кода, вы не указаны какие-либо варианты прерывание, выполняемое через регистры. О, и вы могли бы заставить его работать, если вы собрались для DOS, а не для Windows. Если вы используете Linker, скорее всего, вы создадите исполняемый файл Windows PE. Однако, если вы работаете в 64-битной Windows, как я уже сказал, не пытайтесь.

Одна вещь, которую вы можете сделать - это установить виртуальную машину, такую ​​как VirtualBox или VMware, а затем установить FreeDOS. Он не должен занимать много памяти и позволит вам свободно экспериментировать с сборкой/dos.

+0

Thanks Ninefingers, я думаю, это имеет смысл. Я обязательно посмотрю на виртуальную машину, это, наверное, хорошая идея! Кроме того, прерывание, которое я использовал, не принимает никаких параметров (я так не думаю), так что это не проблема. – Cam

2

В дополнение к @ninefingers отличный ответ - могу ли я добавить int 20H, будет работать только для 16-битных программ. И никогда не может использоваться .exe

См. here.

2

Вы должны быть осторожны при программировании прерываний. Если вы находитесь в чем-либо, кроме RealMode (16 бит), вы обычно не можете достичь прерываний на уровне CPU. Для индексирования таблицы векторов прерываний должна быть доступна таблица дескрипторов прерываний.

IVT находится в кольце 0, где у вас есть прямой, беспрепятственный доступ к оборудованию (процессор, видео и т. Д.). Все приложения будут работать в Ring 3 (включая ОС). IDT содержит индексы к IVT. Это делается для защиты вашего оборудования. Если вы хотите получить доступ к прерываниям из ОС, вам необходимо убедиться, что они доступны для вашего 32-битного источника.

0

Под 32-разрядной ОС Windows существует режим виртуальной 86, и с этим режимом можно использовать старые прерывания RM-программного обеспечения от DOS, поскольку Windows имитирует многие из них. Также, если мы правильно установили драйвер для нашей grafikcard, тогда можно использовать некоторые из перехватов программного обеспечения int 10h, например, чтобы получить vesamodelist vesabios на нашей карте. Да, это эмуляция, но она дает реальные модификации и параметры их окружающей среды на нашей карте, также, если изменение во всех этих vesamodes невозможно под окнами.

16-разрядное приложение DOS также может использовать * .exe-формат, но это MZ-формат, а не PE-формат.

Dirk