Как узнать размер резидента

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

20 мар 2004, 14:01

Размер расчитывается немного по-разному для .exe и .com программ. Стоит заметить, что оставлять резидентно "экзешники" полное извращение, так как это очень не экономно по отношению к 640кБайт памяти. Поэтому я расскажу про .com программу (если все-таки нужен .exe - пишите, приведу пример для .exe).

Для .com:

В самом конце программы надо поставить метку (перед end start или ends). В dx занести размер программы + PSP. Поделить на 16 (1 параграф equ 16 байт). Следующий примитивный пример ничего не делает, кроме того, чтобы остаться резидентом.

Код: Выделить всё

	.model tiny
	.code
	org 100h
_start:
	mov	ah,31h
	mov	dx,offset last_byte ; адрес метки (== размер программы + PSP (100h))
	shr	dx,4 ; делим на 16
	inc	dx ; еще один параграф добавим
	int	21h
last_byte: ; метка, указывает на область "за программой"
	end _start
думаю это не последний мой вопросик...
Всегда пожалуйста :) , только зарегистрируйтесь на форуме, плиз.
mm
Сообщения: 34
Зарегистрирован: 19 фев 2004, 10:36
Контактная информация:

20 мар 2004, 18:36

спасибо ьлин большое.
mm
Сообщения: 34
Зарегистрирован: 19 фев 2004, 10:36
Контактная информация:

21 мар 2004, 13:29

Такой вот еще вопросик )). Тоже на тему резидентов.
Написал я (ну или почти я) прогу, которая садит резидента на обработчик прерывания 2Fh (в обработчике кода никакого, кроме как вызова старого обработчика прерывания).
Вот значит. Код примерно такой:

model tiny
.code
org 100h
_: jmp start

v2F dd ? ;адрес старого обработчика
i2F: jmp cs:v2F ;новый обработчик
last_byte:
start: ;...тут вычисляется v2F
;...
mov ax,3100h
mov dx,offset last_byte
shr dx,4
inc dx
int 21h

end _

Теперь предположим, что это прогу компилят, линкуют, запускают. Затем запускают еще раз. И еще. Короче n раз. После n-ого запуска в памяти будет цепочка обработчиков, которые ссылаются на предыдущие. Все это говорю вот к чему. Как сделать так, чтобы при некоторых условиях (например, параметрах, это не столь важно) программа запускалась, проверяла, есть ли там обработчик прерывания 2Fh, и если это свой обработчик, передвигала вектор обработчика 2Fh на предыдущий, а последний убирала изи памяти?
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

21 мар 2004, 14:18

Сразу скажу - не стоит держать в памяти 2 копии и больше одной резидентной программы. Для этого нужна очень весомая причина. Зачем память захламлять?

Как всегда есть 2 пути: правильный и легкий.
"Правильный" путь использует то же самое int 2Fh вкупе с int 2Dh. Эта навернутая каша называется AMIS (альтернативная спецификация мультиплексорного прерывания). Как оно работает знает похоже только Microsoft. Чтобы соответствовать этой спецификации резидент должен поддерживать определенные правила. Так как я об AMIS знаю (вернее помню) мало, то перейдем к более "веселому" пути (наиболее часто использовавшемся).
Алгоритм такой: программа устанаяливает на себя какой-нибудь мало использующийся вектор прерывания (вроде DDh и проч.) для того, чтобы если программа будет запущена еще раз - она знала, что копия уже в памяти есть и соваться туда не надо. В обработчике резидент проверяет регистр (например ax) на соответствие какому-либо значению (например 0DEADh :) ) и если ax == 0DEADh, значит надо сообщить другой копии, что память уже занята (например вернуть в ax == 0AAAAh и т.п.).

Если же действительно необходимо держать несколько клонов резидента в памяти, то принцип такой (навскидку):
1. Если резидент первый - забрать 2Fh и запомнить предыдущий обработчик
-- его адрес возвращать по запросу (типа 01234h) прерывания (вроде 0EFh) в ax - сегмент, bx - смещение (например).
2. Если резидент не первый - забрать себе 2Fh а адрес самого первого получать вышеуказанным способом.
Но так ли это надо? Ведь n-1 копий просто без дела висеть будут?
mm
Сообщения: 34
Зарегистрирован: 19 фев 2004, 10:36
Контактная информация:

21 мар 2004, 15:30

:)
Память не захламлять - это хорошо, но мне совсем наплевать на ее использование.
То есть у меня просто есть такая задача, мне надо ее решить.
Ручками я это делал, получалось. А вот прогу написать что то не получается ((
Ответить