Как прерывания работают над Intel 8080? Я искал Google и в официальной документации Intel (197X), и я нашел только небольшое описание об этом. Мне нужно подробное объяснение об этом, для эмуляции этого ЦП.
\thispagestyle{empty}
-121--2768742- Хотя я согласен с тем, что я воспринимаю как "намерение" в заявлении Дэвида Басараба: "Нет причин для публичного разоблачения полей", я хотел бы добавить немного другой акцент:
Я бы изменил цитату Давида выше, чтобы читать: "Нет причин для публичного разоблачения полей вне класса... за исключением сознательного выбора инкапсуляции полей в Свойствах, через которые осуществляется строгий контроль доступа.
Свойства не являются просто «шпоном» синтаксиса над полями «, привязанными к» C #: они являются фундаментальной языковой особенностью, разработанной по уважительным причинам, включая:
управление открытым и не открытым внешним классам (инкапсуляция, скрытие данных)
, позволяющее выполнять определенные действия при обращении к Свойству или установке: действия, которые лучше всего выражаются в наборе «get and» свойства, а не «повышаются» до внешних методов.
Интерфейсы по конструкции не могут определять поля ', но могут определять свойства.
Хороший дизайн OO означает сознательный выбор относительно «состояния»:
локальных переменных полей: какое состояние является частным для метода и переходных : локальные переменные, как правило, действительны только в рамках тела метода, или даже с такой «узкой продолжительностью жизни», как в области чего-либо типа 'для цикла. Конечно, переменные параметров в методе также можно рассматривать как «локальные».
поля экземпляра класса: какое состояние является частным для класса и имеет независимое существование для каждого экземпляра класса, но, скорее всего, требуется использовать в нескольких местах класса.
статические поля экземпляра: какое состояние будет свойством только класса, независимо от количества экземпляров класса.
состояние сознательно и сознательно экспонируется «вне» класса: ключевая идея состоит в том, что между классом и «потребителями» данных, которые класс выставляет, существует, по крайней мере, один уровень косвенности. «Обратная сторона» «воздействия» - это, конечно, сознательное намерение скрыть (инкапсулировать, изолировать) код реализации.
a. через общественные свойства: все аспекты этого хорошо освещены во всех других ответах здесь
b. через индексаторы
c. с помощью методов
d. открытые статические переменные обычно встречаются в служебных классах, которые часто являются статическими классами.
Рекомендуется просмотреть: MSDN на полях ... MSDN в свойствах ... MSDN на индексаторах
-121--1255495-Я наконец-то нашел его!
Я создаю переменную, называемую шиной, куда поступает код операции прерывания. Затем я вызвал функцию для обработки прерывания:
void i8080::interruption()
{
// only for RST
cycles -= cycles_table[bus];
instruction[bus]();
INT = false;
}
INT верно, когда требуется прерывание. Инструкции EI и DI обрабатывают INTE.
Если INT и INTE являются истинными, выполняется прерывание.
Указатели функций к обработчикам прерываний хранятся в низкой памяти. Около 32 или около того первых адресов являются аппаратные прерывания: срабатывание оборудования.
Следующие 32 или около того адреса выполнены пользователем, они называются программными прерываниями. Они вызваны инструкцией INT
.
Параметр int - это прерывание программного обеспечения векторное число , которое будет называться прерыванием.
Вам нужно будет использовать инструкцию IRT
для возврата от прерываний.
Вероятно, вы также должны отключить прерывания, как первое, что вы делаете при входе в прерывание.
Для получения дополнительной информации вы должны обратиться к документации для вашей конкретной модели процессора, она имеет тенденцию широко варьироваться.
Прерывание - это способ прерывания процессора с уведомлением об обработке чего-то другого, я не уверен насчет микросхемы Intel 8080, но по моему опыту, лучший способ описания прерывания - это:
The CS: IP
(Code Segment:Instruction Pointer) находится на этой инструкции по адресу памяти 0x0000:0020, в качестве примера для объяснения ее с помощью инструкций Intel 8086, ассемблер тарабарщина и не имеет реального значения. .. инструкции являются образными
0x0000:001C MOV AH, 07 0x0000:001D CMP AH, 0 0x0000:001E JNZ 0x0020 0x0000:001F MOV BX, 20 0x0000:0020 MOV CH, 10 ; CS:IP is pointing here 0x0000:0021 INT 0x15
Когда CS:IP указывает на следующую строку и выдается INT
errupt 15 hexadecimal, вот что происходит, процессор толкает регистры и флаги на стек и затем выполняет код в 0x1000:0100, который обслуживает INT 15 в качестве примера
0x1000:0100 PUSH AX 0x1000:0101 PUSH BX 0x1000:0102 PUSH CX 0x1000:0103 PUSH DX 0x1000:0104 PUSHF 0x1000:0105 MOV ES, CS 0x1000:0106 INC AX 0x1000:0107 .... 0x1000:014B IRET
Затем, когда CS: IP попадает на команду 0x1000:014B, выдается IRET
(Interrupt RETurn), которая выскакивает из ВСЕХ регистров и восстанавливает состояние, и когда она выполняется, CPU's CS:IP указывает сюда, после команды 0x0000:0021.
0x0000:0022 CMP AX, 0 0x0000:0023 ....
То, как CPU знает, куда переходить к определенному смещению, основано на таблице Interrupt Vector (Вектор прерывания), эта таблица векторов прерывания устанавливается BIOS в определенном месте в BIOS, она выглядит следующим образом:
INT BIOS's LOCATION OF INSTRUCTION POINTER --- -------------------------------------- 0 0x3000 1 0x2000 .. .... 15 0x1000 <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO
Эта таблица хранится в BIOS, и при выполнении INT
15, BIOS перенаправит CS:IP в это место в BIOS для выполнения служебного кода, обрабатывающего прерывание.
Еще в старые времена, в Turbo C, существовала возможность переопределения процедур таблицы векторов прерываний собственными функциями обработки прерываний, используя функции setvect
и getvect
, в которых действительные обработчики прерываний перенаправлялись в собственный код.
Надеюсь, я достаточно хорошо объяснил, хорошо, это не Intel 8080, но, насколько я понимаю, и был бы уверен, что концепция для этой микросхемы та же, что и для микросхем семейства Intel x86.
8080. 8080 зависел от внешнего оборудования для управления его обработкой прерываний, поэтому невозможно обобщить. Ищите информацию на контроллерах прерываний Intel 8214 или 8259.