> Веселые исключения для реального режима. Я о таких не > слышал, нигде в документации я их не видел. > Но еще очень странно, что они генерятся не всегда, и в > память ничего не пишется. По моим наблюдениям, генерятся > только после запуска определенных приложений, TLINK, TD в > их числе. Что они делают, что процессор начинает > вырабатывать GP в реальнов режиме?!
Они всегда генерятся в реальном режиме. Результат зависит от обработчика исключения. TLINK, TD тут скорее всего не причем.
Открываем Ральфа Брауна и смотрим Int 0C, 0D
INT 0D C - CPU-generated (80286+) - GENERAL PROTECTION VIOLATION
Desc: the CPU generates this interrupt when it detects a protection violation
which does not fit under any other category having a separate
interrupt
Notes: called in real mode when
an instruction accesses a memory operand extending beyond offset
FFFFh (i.e. WORD at FFFFh or DWORD at FFFDh or higher) in segment
CS, DS, ES, FG, or GS
INT 0C C - CPU-generated (80286+) - STACK FAULT
Desc: this interrupt is generated in protected mode on a stack overflow or
underflow, or if an inter-level transition or task switch references
a stack segment marked "not present"; it is generated in real mode
on accessing a word operand at SS:FFFFh
Проверить очень просто
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
void interrupt Int0D(...)
{
printf("Int 0Dh\n");
exit(0);
}
void main()
{
setvect(0xD, Int0D);
asm mov ax, ds:[0xFFFF]
}
---
При запуске в чистом ДОС выводится
Int 0Dh
Никаких TD, TLINK перед этим я не запускал :-))
C Int 0C аналогично.
|