Організація оперативної пам'яті в ms dos

ім'я програми формату ASCIZ для блоків з PSP

Розмір блоку - 16 байт.

Для визначення першого блоку ланцюжка можна скористатися недокументованою функцією MSDOS 52h. яка в es: bx повертає list of list. в es: [bx-2] знаходиться сегмент першого MCB блоку.

Обробка подій в MSDOS

В процесі роботи можуть виникати деякі події. Події бувають синхронні і асинхронні. Синхронні події - це ті, які відбуваються в процесі виконання програми завжди в одному і тому ж місці. Асинхронні події - це ті, які відбуваються незалежно від роботи програми. До синхронним подій належать виклики системи DOS, BIOS. До асинхронним подій належать виклики обробників натискань клавіші на клавіатурі, надходження символу по каналу зв'язку і т.п. Асинхронні переривання - це, звичайно, апаратні переривання.

Перші 1024 байти - це таблиця векторів (Interupt Table), яка містить для кожного з 256 векторів двухсловний покажчик на обробник. При виклику відповідного переривання контролер переривань зберігає в стеку регістр прапорів, встановлює заборону переривань з більшим чи рівним номером IRQ (для апаратних переривань) зберігає в стеку CS, IP і передає управління оброблювачу переривань. Оброблювач повинен виконати необхідні дії і повернути управління командою IRET. В деякій літературі помилково написано про необхідність дозволити переривання перед поверненням, - цього робити не слід, тому що після дозволу переривання, перед інструкцією IRET починається обробка наступного переривання стоїть в черзі, і є висока ймовірність отримання повідомлення:

Internal Stack Overflow. System halted.

Можливо два способи обробки подій своїм оброблювачем:
  1. повна заміна обробника;
  2. вбудовування в ланцюжок обробників переривання.

До повної заміни доводиться вдаватися досить рідко. Зазвичай це використовується для написання обробника "порожніх" векторів. Вбудовування в ланцюжок обробників переривання використовують всі програмні драйвери, яким необхідно отримати управління при виникненні тих чи інших подій.

Вбудовування в ланцюжок обробників переривання відбувається за такою схемою:

Іноді необхідно отримати управління як до старого обробника, так і після нього. Це робиться таким чином:

Команди Pushf і Call Far імітують Int. команди Pushf. Popf. Retf 2 роблять Iret. але повертають отримала програмі прапори, які повернув старий обробник.

Прийоми "красивого вбудовування" з заміною частини команди:

Схожі статті