Вот код:
.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 прекратил работать" - всегда право, когда оно достигает прерывания.
Это - прерывание, которое я пытаюсь использовать. Это должно просто выйти из программы. Другие, которых я судил, включают ввод символов / вывод и т.д. Ничто не работает.
Я нахожусь на окнах 7, с помощью masm32 с WinAsm IDE.
Существует столько прохладных вещей, кажется, что я должен смочь сделать с прерываниями... однако, это отказывает каждый раз, когда я пытаюсь использовать прерывание - всегда тот же путь.
Это кажется связанным и возможно полезным: Прерывание DOS в катастрофическом отказе блока masm x86
... но я действительно не смог изобразить что-либо из него.
Какие-либо предложения?
Ага. Прерывания такого рода предназначены специально для 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. Он не должен занимать много оперативной памяти и позволит вам свободно экспериментировать со сборкой / сборкой.
В дополнение к отличному ответу @ninefingers - могу ли я добавить, что int 20H будет работать только для 16-битных программ. И никогда не может использоваться .exe
См. здесь .
Вы должны быть осторожны при программировании прерываний. Если вы находитесь в любом другом режиме, кроме RealMode (16-бит), вы обычно не можете получить доступ к прерываниям на уровне ЦП. Для индексации таблицы векторов прерываний должна быть доступна таблица дескрипторов прерываний.
IVT находится в кольце 0, где у вас есть прямой беспрепятственный доступ к оборудованию (ЦП, видео и т. Д.). Все приложения будут работать в кольце 3 (включая ОС). IDT содержит индексы для IVT. Это сделано для защиты вашего оборудования. Если вы хотите получить доступ к прерываниям из ОС, вам необходимо убедиться, что они доступны для вашего 32-битного источника.