Почему моя программа masm32 падает, когда я пытаюсь использовать прерывания? - PullRequest
6 голосов
/ 01 марта 2010

Вот код:

.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 перестал работать» - всегда правильно, когда достигает прерывания.

Это прерывание, которое я пытаюсь использовать. Это должно просто выйти из программы. Другие, которые я пробовал, включают ввод / вывод символов и т. Д. Ничего не работает.

Я на Windows 7, использую masm32 с WinAsm IDE.

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

Это кажется связанным и, возможно, полезным: Прерывание DOS при сбое сборки masm x86

... но я не смог ничего из этого выяснить.

Есть предложения?

Ответы [ 4 ]

5 голосов
/ 01 марта 2010

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

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

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

2 голосов
/ 13 апреля 2010

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

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

2 голосов
/ 01 марта 2010

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

См. здесь .

0 голосов
/ 05 мая 2013

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

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

Dirk

...