Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 300
от 27.11.2005, 21:36

Администратор:Калашников О.А.
В рассылке:Подписчиков: 256, Экспертов: 22
В номере:Вопросов: 3, Ответов: 7


Вопрос № 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


Отправлен: 22.11.2005, 01:27
Вопрос задал: Бочкарёв Алексей (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Бочкарёв Алексей!
в ДОС начало сегмента кратно 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) все получается. В чем может быть причина?
Отправлен: 22.11.2005, 07:31
Вопрос задал: Kotov Vjacheslav (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 18)

Отвечает: Евгений Иванов
Здравствуйте, 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное