Вопрос № 29986: Уважаемые эксперты читаю П. Абеля: "Сегментом называется область, которая начинается
на границе параграфа, т.е. по любому адресу, который делится на 16
без остатка. Хотя сегмент может располагаться в любом месте памяти
и иметь разме...Вопрос № 29992: Здраствуйте пробовал запустить программу из первых выпусков рассылки:
CSEG segment
org 100h
_beg:
mov ax,0B800h
mov es,ax
mov di,0
mov ah,31
mov al,1
mov es:[di],ax
mov ah,10h
int 16h...Вопрос № 30003: Здравствуйте господа эксперты!!!
Подскажите пожалуйста как реализовать резидента, который перехватывает 10 функцию 16 прерывания (т.е. ждет нажатия клавиши) и выводит сообщение о нажатии определенной клавиши, например F1. По выпускам Калашникова ...
Вопрос № 29.986
Уважаемые эксперты читаю П. Абеля: "Сегментом называется область, которая начинается
на границе параграфа, т.е. по любому адресу, который делится на 16
без остатка. Хотя сегмент может располагаться в любом месте памяти
и иметь размер до 64 Кбайт, он требует столько памяти, cколько
необходимо для выполнения программы. "
Вопросы:
1). Что есть параграф?
Это два байта в оперативной памяти, которые начинаются по адресу 00h.
Следующий адрес следующего параграфа: 10h.
Третий параграф расположен по адресу 20h и т.д.
Это верно ?
2).Как можно расшифровать :
"Хотя сегмент может ... иметь размер до 64 Кбайт, он требует
столько памяти, cколько необходимо для выполнения программы. "
Может ли быть сегмент размером более 64 Кбайт в DOS?
Заранее спасибо.
abb
Отвечает: Евгений Иванов
Здравствуйте, Бочкарёв Алексей!
в ДОС начало сегмента кратно 16 байт.
размер не более 64 Кб (это уже физически ограничено реальным режимом :)
ты можешь использовать больше одного сегмента в ДОС.
но я тебе советую использовать win32.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 22.11.2005, 10:15 Оценка за ответ: 4 Комментарий оценки: Если честно, пока предпочитаю не оценивать любой ответ т.к. любой ответ несет для меня полезную информацию.
Отвечает: Ayl
Здравствуйте, Бочкарёв Алексей!
1. Параграф - это 16 последовательных байт в памяти, адрес первого из которых кратен 16:
00000-0000F - первый параграф памяти
00010-0001F - второй параграф памяти
....
FFFF0-FFFFF - 65536-й параграф памяти
2. В ДОС сегмент не может быть более 64К. Когда ты устанавливаешь значение адреса начала сегмента, то максимально с помощью смещения можешь адресовать ровно 64К.
Абель (или переводчик) в данном отрывке, на мой взгляд, смешивает два понятия: физический размер сегмента и логический размер сегмента. Физический размер сегмента в ДОС всегда будет 64К. Логический - столько, сколько тебе нужно, в пределах до 64К.
Кроме этого, еще есть блоки памяти ДОС. Ты можешь попросить ДОС выделить тебе память (некоторое число ПАРАГРАФОВ памяти). В пределе - от 1 до 65535, реально (помним про ограничение ДОС в 640К!) - гораздо меньше. При этом размер выделяемой памяти операционой системой может быть больше 64К. И работать с ней ты можешь как с непрерывной областью, но изменяя в нужный момент значение сегментного регистра. Без изменения значения сегментного регистра ты не сможешь обратиться более чем к 64К памяти.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 22.11.2005, 13:02 Оценка за ответ: 5
Вопрос № 29.992
Здраствуйте пробовал запустить программу из первых выпусков рассылки:
CSEG segment
org 100h
_beg:
mov ax,0B800h
mov es,ax
mov di,0
mov ah,31
mov al,1
mov es:[di],ax
mov ah,10h
int 16h
int 20h
CSEG ends
end _beg
на экран ничего не выводит (пробовал и на AMD и на .386), хотя через прерывания (BIOS и DOS) все получается. В чем может быть причина?
Отвечает: Евгений Иванов
Здравствуйте, Kotov Vjacheslav!
_beg:
sub ax, ax
inc al
inc al
inc al
db CDh, 16
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 22.11.2005, 10:16
Отвечает: Ayl
Здравствуйте, Kotov Vjacheslav!
Евгений Иванов хотел сказать, что перед запуском этой программы нужно переустановить режим экрана. Потому что, при запуске этой программы в режиме эмуляции ДОС, в качестве отображаемой страницы установлена страница 1. А программа пытается вывести информацию на страницу 0. Использование последовательности команд, предложенной Евгением, производит установку текстового режима 80*25. При этом BIOS устанавливает в качестве отображаемой страницы страницу 0.
Без извращений код выглядит так:
mov ax, 3
int 10h
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 22.11.2005, 13:10
Отвечает: Юра Устинов
Здравствуйте, Kotov Vjacheslav!
Посмотрите, здесь можете сами догадаться.
.model small
.code
org 100h
start:
xor di,di
call Fi
cmp al,32
je con
push ax
mov ax,03h
int 10h
mov ax,0b800h
mov es,ax
pop ax
mov ah,1
mov es:[di],ax
jmp start
con:
ret
Fi proc
mov ah,10h
int 16h
ret
Fi endp
end start
--------- Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 6-ой класс)
Отправлен: 24.11.2005, 06:57
Вопрос № 30.003
Здравствуйте господа эксперты!!!
Подскажите пожалуйста как реализовать резидента, который перехватывает 10 функцию 16 прерывания (т.е. ждет нажатия клавиши) и выводит сообщение о нажатии определенной клавиши, например F1. По выпускам Калашникова я разобрался с перехватом 21 прерывания, а вот на 16 ое применить не получается!!! Мож кто исходничек предоставить сможет с пояснениями -буду благодарен!!!
Заранее благодарен!!!
Отправлен: 22.11.2005, 10:40
Вопрос задал: Rams (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Евгений Иванов
Здравствуйте, Rams!
действуй также. по стандартной схеме.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 22.11.2005, 10:59
Отвечает: Ayl
Здравствуйте, Rams!
А в чем проблема?
Перехватываешь стандартным образом.
В обработчике делаешь следующее:
1. Проверяешь, что вызвана функция 10h.
2. Если нет - jmp на старый обработчик прерывания.
3. Call на старый обработчик прерывания.
4. Проверяешь значение скен-кода (регистр AH). Если твой - выводишь сообщение.
5. Завершаешь обработчик.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 22.11.2005, 13:50 Оценка за ответ: 5