2012-03-11 2 views
4

Моя проблема в том, что мне приходится перепрограммировать прерывания без использования системных библиотек, таких как dos.h, поэтому я не могу использовать такие функции, как getvect или setvect. Я сделал рабочую программу на C (с вставками asm), но она использует функции DOS. Как сделать это без dos.h и вместо этого использовать asm?Препровождение перепрограммирования в c/asm x86

Я думал о написании программы на постоянное место в памяти, а затем изменить ADRES в векторах прерываний таблицы, но я понятия не имею, как это сделать - тем более, что программа в основном в С.

я должен перепрограммировать системные часы прерывание и прерывание LPT. Таймер системных часов был ускорен, поэтому каждые несколько раз мне приходится генерировать первоначальное системное прерывание.

+2

Вау, это навевает воспоминания о DOS программирования 20-25 лет назад. На какой платформе вы пытаетесь это сделать? 16-разрядная MS-DOS (или Dosbox)? –

+0

Для меня это возвращает 2 года воспоминания :) OSDev вызывает привыкание .. –

+0

Я сначала использовал DOS в win98, но теперь я использую FreeDos – micmax93

ответ

3

Насколько я помню, таблица прерывания началась в 00:00: 00:00. Есть 4 байта на запись прерывания: 2 байта для сегмента 2 для смещения.

xor ax, ax 
mov es, ax 

mov bx, interrupt_number 
mov ax, cs 
mov es[bx*4], ax 
mov es[bx*4+2], offset yourSubroutine 

Это должно быть что-то вроде этого, хотя я не помню точно

+3

Это кажется правильным. Единственное, что нужно иметь в виду, - сначала сохранить исходные значения, поэтому, когда вы хотите вызвать его или когда выходите из приложения, вы можете обратиться к оригинальному обработчику. –

+0

Исправить, ssg. Вы всегда должны сохранять исходные значения и восстанавливать их, как только ваша программа попадает в int 20h или mov ax, 0x4c int 21h :) –

+0

Хорошо, но моя проблема заключается в том, как получить адрес моей программы, особенно, что это не нормально asm - my программа составляет 70% в C. – micmax93

Смежные вопросы