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

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

Я нахожусь на окнах 7, с помощью masm32 с WinAsm IDE.

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

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

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

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

6
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

Ага. Прерывания такого рода предназначены специально для 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. Он не должен занимать много оперативной памяти и позволит вам свободно экспериментировать со сборкой / сборкой.

5
ответ дан 10 December 2019 в 02:46
поделиться

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

См. здесь .

2
ответ дан 10 December 2019 в 02:46
поделиться

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

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

2
ответ дан 10 December 2019 в 02:46
поделиться