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

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

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

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

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

... но я действительно не смог ничего понять из этого.

Какие-либо предложения?


person Cam    schedule 01.03.2010    source источник


Ответы (4)


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

Если вы пишете собственные приложения для NT (вряд ли вы будете это делать, если не знаете, что это такое, но если вы хотите узнать, посмотрите блог Марка Руссиновича в 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.

person Community    schedule 01.03.2010
comment
Спасибо Ninefingers, я думаю, это имеет смысл. Я обязательно посмотрю на виртуальную машину, это, вероятно, хорошая идея! Кроме того, прерывание, которое я использовал, не принимает никаких параметров (я так не думаю), так что это не будет проблемой. - person Cam; 01.03.2010

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

См. здесь.

person Preet Sangha    schedule 01.03.2010

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

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

person IAbstract    schedule 13.04.2010

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

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

Кортик

person Dirk Wolfgang Glomp    schedule 05.05.2013