Что INT является 21-м?

Следующее не поймает исключение в.Net. Вместо этого это приводит к исключению StackOverflow.

private void button1_Click( object sender, EventArgs e ) {
    try {
        CallMe(234);
    } catch (Exception ex) {
        label1.Text = ex.Message.ToString();
    }
}
private void CallMe( Int32 x ) {
    CallMe(x);
}

Для комментаторов (и downvotes):
было бы чрезвычайно редко для переполнения стека быть этим очевидным. Однако, если Вы происходите, Вы не собираетесь ловить исключение и вероятно проведете несколько часов, пытаясь выследить точно, где проблема. Это может быть составлено, если ТАК происходит в небольших используемых логических путях, особенно на веб-приложении, где Вы не могли бы знать точные условия, которые начали проблему.

Это - та же самая ситуация как принятый ответ на этот вопрос ( https://stackoverflow.com/a/241194/2424). Метод get свойства на том ответе по существу делает ту же самую вещь как вышеупомянутый код и отказывает без отслеживания стека.

5
задан Community 23 May 2017 в 11:54
поделиться

8 ответов

Из здесь : Многоцелевое прерывание DOS, используемое для различных функций, включая чтение с клавиатуры и запись в консоль и принтер. Он также использовался для чтения и записи дисков с использованием более раннего метода блока управления файлами (FCB).

12
ответ дан 18 December 2019 в 05:24
поделиться

Список прерываний Ральфа Брауна содержит много информации о том, какое прерывание и что делает. int 21 , как и все остальные, поддерживает широкий спектр функций в зависимости от значений регистров.

Также доступна не-HTML версия списка Ральфа Брауна .

7
ответ дан 18 December 2019 в 05:24
поделиться

Инструкция INT - это программное прерывание. Это вызывает переход к подпрограмме, на которую указывает вектор прерывания, который является фиксированной ячейкой памяти. Преимущество инструкции INT состоит в том, что она имеет длину всего 2 байта, в отличие от, возможно, 6 для JMP, и что ее можно легко перенаправить, изменив содержимое вектора прерывания.

3
ответ дан 18 December 2019 в 05:24
поделиться

Int 0x21 - это x86 программное прерывание - в основном это означает, что в фиксированной точке памяти есть таблица прерываний, в которой перечислены адреса функций программного прерывания. Когда процессор x86 получает код операции прерывания (или иным образом решает, что должно быть выполнено определенное программное прерывание), он ссылается на эту таблицу для выполнения вызова в этой точке (функция в этой точке должна использовать iret вместо ret , чтобы вернуться).

Можно переназначить Int 0x21 и другие программные прерывания (даже внутри DOS, хотя это может иметь отрицательные побочные эффекты). Одно интересное программное прерывание для сопоставления или цепочки - это Int 0x1C (или 0x08, если вы осторожны), это системное прерывание, вызываемое 18,2 раза в секунду. Это можно использовать для создания "фоновых" процессов даже в однопоточном реальном режиме (процесс реального режима будет прерываться 18,2 раза в секунду для вызова вашей функции прерывания).

В операционной системе DOS (или системе, которая является обеспечивая некоторую эмуляцию DOS, такую ​​как консоль Windows) Int 0x21 отображается на то, что фактически является основным «API» операционной системы DOS. Предоставляя разные значения регистру AH, можно выполнять различные функции DOS, такие как открытие файла (AH = 0x3D) или печать на экране (AH = 0x09).

В операционной системе DOS (или системе, которая обеспечивает некоторую эмуляцию DOS, например, консоль Windows) Int 0x21 отображается на то, что фактически является основным «API» операционной системы DOS. Предоставляя разные значения регистру AH, можно выполнять различные функции DOS, такие как открытие файла (AH = 0x3D) или печать на экране (AH = 0x09).

В операционной системе DOS (или системе, которая обеспечивает некоторую эмуляцию DOS, например, консоль Windows) Int 0x21 отображается на то, что фактически является основным «API» операционной системы DOS. Предоставляя разные значения регистру AH, можно выполнять различные функции DOS, такие как открытие файла (AH = 0x3D) или печать на экране (AH = 0x09).

2
ответ дан 18 December 2019 в 05:24
поделиться

Это из великого Искусство программирования на языке ассемблера о прерываниях:

На 80x86 есть три типа событий, обычно известных как прерывания: ловушки, исключения и прерывания (аппаратные прерывания). В этой главе описывается каждая из этих форм и обсуждаются их поддержка процессоров 80x86 и компьютеров, совместимых с ПК.

Хотя термины ловушка и исключение часто используются как синонимы, мы будет использовать термин ловушка для обозначения программиста, инициированного и ожидаемого передача управления специальной программе-обработчику. Во многих отношениях trap - это не что иное, как вызов специальной подпрограммы. Много текстов называют ловушки программными прерываниями. Инструкция 80x86 int: основное средство расстрела ловушки. Обратите внимание, что ловушки обычно безусловный; то есть, когда вы выполняете инструкцию int, управляйте всегда передает процедуру, связанную с ловушкой. поскольку ловушки выполняются с помощью явной инструкции, это легко определить какие именно инструкции в программе будут вызывать обработку прерывания

Глава 17 - Структура прерывания и процедуры обслуживания прерывания

2
ответ дан 18 December 2019 в 05:24
поделиться

(Почти) весь интерфейс DOS был доступен в виде команд INT21h с параметрами в различных регистрах. Это небольшая хитрость - использовать встроенную аппаратную таблицу для перехода к нужному коду. Также INT 33h был для мыши.

1
ответ дан 18 December 2019 в 05:24
поделиться

Это «программное прерывание», то есть вовсе не аппаратное прерывание.

Когда приложение вызывает программное прерывание, это, по сути, то же самое, что и его вызов подпрограммы,

1
ответ дан 18 December 2019 в 05:24
поделиться

DOS можно рассматривать как библиотеку, используемую для предоставления абстракции файлов / каталогов для ПК (-и немного больше). int 21h - это простой аппаратный «трюк», который позволяет легко вызывать код из этой библиотеки, не зная заранее, где он будет расположен в памяти. В качестве альтернативы, вы можете думать об этом как о способе использования DOS API.

Теперь тема программных прерываний является сложной, отчасти потому, что концепции развивались со временем, когда Intel добавляла функции к семейству x86, пытаясь остаются совместимыми со старым программным обеспечением. Для правильного объяснения потребуется несколько страниц, но я постараюсь быть кратким.

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

Реальный режим - это простой, «оригинальный» режим работы для процессора x86. Это режим, в котором работает DOS (когда вы запускаете программы DOS под Windows, процессор реального режима виртуализируется, поэтому в нем применяются те же правила). Текущая запущенная программа имеет полный контроль над процессором.

В реальном режиме есть таблица векторов, которая сообщает процессору, по какому адресу переходить для каждого прерывания от 0 до 255. Эта таблица заполняется BIOS и DOS, а также драйверы устройств, а иногда и программы с особыми потребностями. Некоторые из этих прерываний могут быть сгенерированы аппаратно (например, нажатием клавиши). Другие генерируются определенными программными условиями (например, делением на 0). Любые из них могут быть сгенерированы посредством выполнения инструкции int n .

Программы могут устанавливать / сбрасывать флаг «разрешить прерывания»; этот флаг влияет только на аппаратные прерывания и не влияет на инструкции int .

Разработчики DOS решили использовать номер прерывания 21h для обработки запросов DOS - это число не имеет реального значения: это была просто неиспользованная запись в то время. Есть много других (например, номер 10h - это установленная в BIOS процедура прерывания, которая имеет дело с графикой). Также обратите внимание, что все это только для совместимых с IBM PC. Процессоры x86, скажем, во встроенных системах могут иметь свое программное обеспечение и таблицы прерываний, организованные совершенно иначе!

Защищенный режим - это сложный, «ориентированный на безопасность» режим, который был введен в процессоре 286 и значительно расширен в процессоре 386. Он предоставляет несколько уровней привилегий. ОС должна настроить все это (и если ОС ошибается, у вас есть потенциальная уязвимость безопасности). Пользовательские программы обычно ограничиваются режимом работы с «минимальными привилегиями», при котором попытка доступа к аппаратным портам или изменение флага прерывания или доступ к определенным областям памяти останавливает программу и позволяет ОС решать, что делать (будь то завершение программе или дать программе то, что она хочет).

Обработка прерываний усложняется. Достаточно сказать, что обычно, если пользовательская программа выполняет программное прерывание, номер прерывания , а не используется в качестве вектора в таблице прерываний. Скорее генерируется общее исключение защиты, и обработчик ОС для указанного исключения может (если ОС спроектирована таким образом) решить, что нужно процессу, и обслужить запрос. Я почти уверен, что Linux и Windows в прошлом (если не сейчас) использовали такой механизм для своих системных вызовов.

9
ответ дан 18 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: