Вопрос № 128984: Здравствуйте!
Когда оставляешь резидента в памяти - в литературе у Калашникова я встретил такую рекомендацию:
Избавляться от сегмента окружения (если конечно он не нужен непосредственно для работы самого этого резидента).
А дальше у меня ...Вопрос № 128989: Здравствуйте!
В рассылке №23 у Калашникова есть пример резидента. Меня интересует один небольшой фрагмент – в «выдернутом» виде вставил его в приложение.
А непонятно мне вот что:
Почему буфер клавиатуры может быть пуст, если перед этим в...Вопрос № 129029: Помогите ПОЖАЛУЙСТА!!!Зачетная неделя, а у меня задача, оказывается, в дальнем ящике лежит!
Ввести число К и символ С. Вывести на экран:
С
С
С
С
...
где (К-1) строк и (К-1) столбцов. Выводить при нажатии клавиши.
..
Вопрос № 128.984
Здравствуйте!
Когда оставляешь резидента в памяти - в литературе у Калашникова я встретил такую рекомендацию:
Избавляться от сегмента окружения (если конечно он не нужен непосредственно для работы самого этого резидента).
А дальше у меня возникла куча вопросов:
Хотелось бы узнать: большой ли от этого толк в экономии памяти?
Можно ли затем в этот освобожденный кусочек, что-то дельное поместить?
Когда мы освобождаем этот сегмент – DOS знает, какого он размера?
Да и вообще не понимаю, как это все размещается в памяти, точнее в каком порядке. Ниже попытаюсь текстом изобразить схему. Допустим в памяти две программы, после первой память была освобождена.
Вариант 1:
…………………
сегмент окружения 1-ой программы
……………….
1-ая программа
…………………
сегмент окружения 2-ой программы
……………….
2-ая программа
…………………..До конца памяти все отдано 2-ой программе
Вариант 2:
…………………
сегмент окружения 1-ой программы
…………………
сегмент окружения 2-ой программы
……………….
1-ая программа
……………….
2-ая программа
…………………..До конца памяти все отдано 2-ой программе
Скорее всего, правильный вариант, наверное, другой.
Я все никак не могу сформулировать нормально вопрос. Постарайтесь меня понять:
Ведь если мы освободим «сегмент окружения 1-ой программы» для 2-ой программы толку это большого не даст?
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Бартосик Феликс Михайлович!
1)Толк в освобождении сегмента окружения...
Например, при запуске 2-ой программы система сможет построить сегмент окружения на том же месте.
Можно даже переписать резидент в память, начиная с сегмента окружения, увеличив тем самым сплошной участок свободной памяти.
2)Все, что туда поместится: буфер, программа может себя туда скопировать...
3)Конечно, знает. По адресу любого сегмента минус 10h (или для сегмента -
минус 1), т.е. в 16-ти байтах перед сегментом, лежит MCB (Memory Control Block),
в котором есть и длина сегмента
4)В памяти размещается обычно последовательно: сначала все для программы 1, затем - для программы 2, т.е. - 1-й вариант
Ну и, наконец, "толку большого" в общем-то не будет. Но, когда надо что-то спрятать
или важен каждый килобайт, то может понадобиться и эта память.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 25.03.2008, 13:20 Оценка за ответ: 5 Комментарий оценки: Спасибо Игорь Витальевич!
Мне очень приятно, что Вы меня правильно поняли и ответили буквально на все.
Вопрос № 128.989
Здравствуйте!
В рассылке №23 у Калашникова есть пример резидента. Меня интересует один небольшой фрагмент – в «выдернутом» виде вставил его в приложение.
А непонятно мне вот что:
Почему буфер клавиатуры может быть пуст, если перед этим вызывается настоящий обработчик 09-ого прерывания? Я понимаю, если бы настоящий обработчик 09-ого прерывания вызывали после int 16h.
И кто же его заполняет, если настоящий обработчик 09-ого прерывания уже отработал?
Или еще не отработал? Может быть, буфер как-то в фоновом режиме заполняется?
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Бартосик Феликс Михайлович!
Не все, что обрабатывает 9-й вектор, попадает в буфер клавиатуры...
Например, клавиши Ctrl, Alt, Shift
Плюс прерывания возникают еще и по ОТЖАТИЮ клавиши.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 25.03.2008, 13:47 Оценка за ответ: 5 Комментарий оценки: Ну в общем я понял. Спасибо.
Отвечает: HASPAKA
Здравствуйте, Бартосик Феликс Михайлович!
дело в том, что обработчик срабатывает по нажатию/отжатию клавиши, то есть дважды. Кроме того, некоторые клавишесочетания могут попросту не заносится в буфер. В приведенном вами фрагменте проверка на отсутсвие значения в буфере необходима для исключения возможности ложной отработки кода, например в случае когда была нажата комбинация "Alt+Enter".
Ответ отправил: HASPAKA (статус: 1-ый класс)
Ответ отправлен: 25.03.2008, 14:01 Оценка за ответ: 5 Комментарий оценки: Ну в общем я понял. Спасибо.
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Бартосик Феликс Михайлович!
Вызов оригинального обработчика событий клавиатуры:
pushf
call dword ptr cs:[0FCh]
Он и заполняет буфер клавиатуры, если не обрабатывает это событие(эту клавишу) сам.
Примерами таких клавиш могут быть Caps Lock, Num Lock и Scroll Lock.
Вся работа MS-DOS построенна на программно-аппаратных прерываниях, которые останавливают основную программу, выполняют нужные действия и затем возвращают управление основной программе. С точки зрения программы всё происходит в фоновом режиме.
Удачи!
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Профессионал) Украина, Киев Тел.: +380958380164 Адрес: Украина г.Киев ---- Ответ отправлен: 25.03.2008, 14:02 Оценка за ответ: 5 Комментарий оценки: Ну в общем я понял. Спасибо.
Вопрос № 129.029
Помогите ПОЖАЛУЙСТА!!!Зачетная неделя, а у меня задача, оказывается, в дальнем ящике лежит!
Ввести число К и символ С. Вывести на экран:
С
С
С
С
...
где (К-1) строк и (К-1) столбцов. Выводить при нажатии клавиши.
Помогите ПОЖАЛУЙСТа! Я просто умоляю! Мила
Отвечает: Boriss
Здравствуйте, Ahmadullina Mila Raufovna!
Вот такой вариант посмотрите, как в приложении
Еще исходный код можно скачать тут
Если неправильно Вас понял, или не понятно что - в минифоруме спросите
--
ЗЫ: Вы так просили Вам помочь, а когда эксперт задал Вам уточняющий вопрос - Вы его почему-то проигнорировали. Это невежливо
Приложение:
--------- Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор) Россия, Саранск Организация: Мордовский госуниверситет, Саранск, Факультет Электронной Техники WWW:Программирование на Паскале ---- Ответ отправлен: 26.03.2008, 10:50
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Ahmadullina Mila Raufovna!
Программа в приложении.
Удачи!
Приложение:
--------- И только наступив на грабли мы приобретаем драгоценный опыт!
Ответ отправил: Зенченко Константин Николаевич (статус: Профессионал) Украина, Киев Тел.: +380958380164 Адрес: Украина г.Киев ---- Ответ отправлен: 27.03.2008, 11:05