Рассказываю - в msdos создавая обработчик прерывания, необходимо было учитывать, что при его вызове значения всех регистров, кроме cs, указывали на значения регистров контекста ПРЕРВАННОЙ ЗАДАЧИ. Поэтому перед установкой обработчика прерывания значения регистров я сохранял относительно cs, используя этот регистр как ЧАСТЬ УКАЗАТЕЛЯ НА ДАННЫЕ..
Не знаю
sss про какие обработчики прерываний ты говоришь но те обработчики прерываний которые я видел не использовали 'CS' в качестве сегмента данных, они использовали свои участки памяти зарезервированные за ранее, стек использовался прерванного процесса. Подобным образом поступали и видимые мной резидентные программы которые подменяли обработчики прерываний своим кодом.
Что бы не быть голословным вот пример нескольких прерываний BIOS (в свое время сильно увлекся низкоуровневым программирование):
Award Software, Inc.
ASUS TUSI-M ACPI BIOS Revision 1018 Beta 005
07/30/2003
SiS 630 AGP True Color Graphics and Video Accelerator
Bytes Video Memory,
BIOS Version 2.08.50
Support VESA BIOS Extension Ver 3.0
Silicon Integrated Systems Corp.
2.08.50
Прерывание:
Адрес: F000:EF6F FEF6F
irq 0h: Деление на нуль. Внутреннее: активизируется при попытке
деления на нуль.
sector: file format binary
Disassembly of section .data:
/*
* Я так понял, что суть данного кода в том, что бы запретить
* аппаратные прерывания, в противном случее код что то мутит
* с контроллерами прерываний.
*
* Но на сколько я знаю, что бы запретить напремер
* IRQ 0 надо поступать так:
* inb $0x20, %al
* orb $1, %al
* outb %al, $0x20
*/
000fef6f <.data+0xfef6f>:
fef6f: 1e push %ds
fef70: 50 push %ax
fef71: 51 push %cx
/* В сегмент данных DS загружаетя 0040h (область данных BIOS */
fef72: b8 40 00 mov $0x40,%ax
fef75: 8e d8 mov %ax,%ds
fef77: b0 0b mov $0xb,%al
/* Записывается значение 00001011b в порт первого контроллера прерываний */
fef79: e6 20 out %al,$0x20
fef7b: e6 e1 out %al,$0xe1 /* ??? не знаю чей порт */
fef7d: e4 20 in $0x20,%al
fef7f: e6 e1 out %al,$0xe1
fef81: 8a e0 mov %al,%ah
fef83: 0a c0 or %al,%al
fef85: 74 32 je 0xfefb9
/* Повторяется все тоже самое только для второго контроллера */
fef87: b0 0b mov $0xb,%al
fef89: e6 a0 out %al,$0xa0
fef8b: e6 e1 out %al,$0xe1
fef8d: e4 a0 in $0xa0,%al
fef8f: e6 e1 out %al,$0xe1
fef91: 8a c8 mov %al,%cl
fef93: 0a c0 or %al,%al
fef95: 74 10 je 0xfefa7
fef97: e4 a1 in $0xa1,%al
fef99: e6 e1 out %al,$0xe1
fef9b: 0a c1 or %cl,%al
fef9d: e6 a1 out %al,$0xa1
fef9f: e6 e1 out %al,$0xe1
fefa1: b0 20 mov $0x20,%al
fefa3: e6 a0 out %al,$0xa0
fefa5: eb 0a jmp 0xfefb1
fefa7: e4 21 in $0x21,%al
fefa9: 0a c4 or %ah,%al
fefab: e6 e1 out %al,$0xe1
fefad: 24 fb and $0xfb,%al
fefaf: e6 21 out %al,$0x21
fefb1: b0 20 mov $0x20,%al
fefb3: e6 e1 out %al,$0xe1
fefb5: e6 20 out %al,$0x20
fefb7: eb 02 jmp 0xfefbb
/* Записывает по адресу 0040:006B значение 0xFF */
fefb9: b4 ff mov $0xff,%ah
fefbb: 88 26 6b 00 mov %ah,107
fefbf: 59 pop %cx
fefc0: 58 pop %ax
fefc1: 1f pop %ds
fefc2: cf iret
Вот еще один обработчик прерывания:
Адрес: F000:E2C3 FE2C3
irq 2h: Не маскируемое. Внутреннее: активизируется при
возникновении ошибок памяти.
dump: file format binary
Disassembly of section .data:
000fe2c3 <.data+0xfe2c3>:
fe2c3: e9 c6 09 jmp 0xec8c
...
000fe2c6 <.data+0xfe2c6>:
fe2c6: 50 push %ax
fe2c7: b0 8f mov $0x8f,%al
fe2c9: e8 50 01 call 0xe41c
fe2cc: e4 61 in $0x61,%al
fe2ce: 8a e0 mov %al,%ah
fe2d0: e8 81 06 call 0xe954
fe2d3: f6 c4 c0 test $0xc0,%ah
fe2d6: 75 10 jne 0xfe2e8
fe2d8: 8a c4 mov %ah,%al
fe2da: e6 e1 out %al,$0xe1
fe2dc: e6 61 out %al,$0x61
fe2de: b0 0f mov $0xf,%al
fe2e0: e8 39 01 call 0xe41c
fe2e3: 58 pop %ax
fe2e4: cf iret
...
000fe41c <.data+0xfe41c>:
fe41c: e6 70 out %al,$0x70
fe41e: e6 e1 out %al,$0xe1
fe420: e4 71 in $0x71,%al
fe422: e6 e1 out %al,$0xe1
fe424: c3 ret
...
000fe954 <.data+0xfe954>:
fe954: e4 61 in $0x61,%al
fe956: e6 e1 out %al,$0xe1
fe958: 0c 0c or $0xc,%al
fe95a: e6 61 out %al,$0x61
fe95c: c3 ret
...
000fec8c <.data+0xfec8c>:
fec8c: e8 06 00 call 0xec95
fec8f: 75 03 jne 0xfec94
fec91: e9 32 f6 jmp 0xe2c6
fec94: cf iret
fec95: 1e push %ds
fec96: 50 push %ax
fec97: b8 40 00 mov $0x40,%ax
fec9a: 8e d8 mov %ax,%ds
fec9c: f7 06 15 00 04 00 testw $0x4,21
feca2: 58 pop %ax
feca3: 1f pop %ds
feca4: c3 ret
sss ты можешь показать кусок кода обработчика прерываний где использовался бы регистр 'CS' в качестве сегмента данных?
Никогда не приходилось задумываться зачем нужен DEP да?
Не знаю о каком DEP ты говоришь, но если ты имеешь ввиду 'Data Execution Protection — Защита от Выполнения Данных' то я тебе могу сказать следующее.
Если ты говоришь о использовании регистра 'CS' в качестве сегмента данных для обращения к памяти в MS-DOS, то говорить о каком то 'Data Execution Protection' да же и не приходиться. Почему не приходится я думаю ты и сам знаешь, по крайней мере должен знать если писал обработчики прерываний под MS-DOS.
Если ты упомянул 'Data Execution Protection' в применении к 32-разрядному защищенному режиму. То в данном режиме обратиться к данным в другом сегменте с использованием селектора находящегося в регистре 'CS' тебе не удастся, т.к. данный селектор ссылается на дескриптор который описывает сегмент исполняемого кода и считать или записать что то с использованием данного селектора у тебя не получиться, это сразу вызовет 'исключение общей защиты (#GP)'.