Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2009, 22:58   #1
Reign
 
Регистрация: 22.07.2008
Сообщений: 9
Вопрос Сегментацмя памяти в DOS и вопросы по книге Калашникова

Столкнулся со сложной темой, как сегментация памяти в DOS, так же меня смутили: функции, адреса, запись информации в память, не получается получить ожидаемого результата от программы из 3главы книги.
Цитата:
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
Программа должна выводить в верхнем левом углу на синем фоне весёлую "рожицу", вместо этого после компиляции появляется окно командной строки которая сразу же исчезает, после нажатия любой клавиши на клавиатуре.Не совсем понятна двоичная система счисления.
Reign вне форума Ответить с цитированием
Старый 21.02.2009, 00:13   #2
ASSEMBLER
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 27
По умолчанию

запусти из-под нортона или FAR, ну или вот из под этого и всё выведется (просто дело в поддержке виндой досовского режима):
Вложения
Тип файла: zip volcov commander5.zip (80.0 Кб, 13 просмотров)
Программы на заказ Delphi, Pascal, С++, Assembler e-mail: greatrock@mail.ru
<--Если я вам помог не забываем жать на весы
ASSEMBLER вне форума Ответить с цитированием
Старый 21.02.2009, 06:29   #3
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию

Тут проблема в видео режиме. Добавь вот это в самое начало и будет работать.
Код:
mov ah, 0
mov al, 3
int 10h
Armorer вне форума Ответить с цитированием
Старый 21.02.2009, 07:21   #4
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

можно так:
Код:
 
                        ...
                        mov ah,08h
                        int 21h
                        int 20h
                        ...
Это ожидание нажатия клавиши.Так что,окно не будет сразу исчезать.

Последний раз редактировалось smileman; 21.02.2009 в 07:33.
smileman вне форума Ответить с цитированием
Старый 21.02.2009, 10:34   #5
Armorer
Подтвердите свой е-майл
 
Регистрация: 07.04.2007
Сообщений: 120
По умолчанию

Цитата:
Сообщение от smileman Посмотреть сообщение
можно так:
Код:
 
                        ...
                        mov ah,08h
                        int 21h
                        int 20h
                        ...
Это ожидание нажатия клавиши.Так что,окно не будет сразу исчезать.
Как я понимаю у Reign'а уже было одидание нажатия клавиши вот в этих строках.
Код:
mov ah,10h
int 16h
И он написал что "появляется окно командной строки которая сразу же исчезает, после нажатия любой клавиши на клавиатуре."
Значит проблема не в этом =)
Armorer вне форума Ответить с цитированием
Старый 21.02.2009, 10:36   #6
Reign
 
Регистрация: 22.07.2008
Сообщений: 9
Радость

ASSEMBLER,дейсвительно, запустил под этим командером и выполнилось!
Armorer,добавил эти строчки в начале кода и так же само выполнилось, как без запуска командера.
Вопрос:Что эти строчки выполняют?
Цитата:
mov ah, 0
mov al, 3
int 10h
mov ah,0h; загрузка числа 0h в регистр ah
mov al,3h; загрузка числа 3h в регистр al
int 10h; в справочнике посмотрел,что означает видео сервис.
Вопрос: зачем нужно было загружать сначала ноль в регистр ah, если можно было загрузить в сразу в al.Ведь ноль не имеет значения и в регистре AX окажется то же значение 0003H если не ошибаюсь.
Не могу понять зачем загружать какие-либо значения, если можно обойтись без них?
smileman , Попробовал так сделать
заменил, это:
Цитата:
mov ah,10h
int 16h

int 20h
Этим:
Цитата:
mov ah,08h
int 21h
int 20h
и получил, что оно наоборот исчезает.
Вроде бы с ожиданием нажатия клавимши у меня всё было нормально.
Не пойму к чему это?
Посмотрел в справочнике
08H; это функция, которая означает "Консольный ввод без эха".Что это значает?

Есть ещё пару вопросов ко всем:
Функция и любое загруженное чило это одно и тоже, и как, ведь в программах используют например один и тот же регистр для функции, а потом загружают в тот же регистр другое число?И непример загружая в регистр любое число, ямогу не нароком загрузить функцию?
Armorer,
Цитата:
которая сразу же исчезает, после нажатия любой клавиши на клавиатуре
Немного недоглядел.
Это конечно к теме не относится.
Конечно, спасибо за твои намерения помочь!Думаю, что мне ещё надо решать проблему с лаконичностью речи

Последний раз редактировалось Reign; 21.02.2009 в 12:14.
Reign вне форума Ответить с цитированием
Старый 21.02.2009, 12:16   #7
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

Armorer,Reign
хехе..))) не внимательно прочитал )))
Reign
Ты имеешь ввиду вызов процедуры прерывания? Чтобы вызвать прерывание необходимо прописать- int x,где x-номер прерывания.В регистрах перед вызовом пишешь параметры для вызова прерывания(номера функций и тд),а на выходе в этих же регистрах получаешь значения(результаты вызова прерывания),например:
Код:
                   ... 
                   mov ah,08h ; номер функции 
                   int 21h       ; номер прерывания 
                   ; теперь в al значение введенной клавиши
                   ...
smileman вне форума Ответить с цитированием
Старый 21.02.2009, 12:48   #8
Reign
 
Регистрация: 22.07.2008
Сообщений: 9
По умолчанию

Цитата:
mov ah,10h
int 16h
int 20h
Вобще это не то что я хотел сказать,но у меня и по этому есть вопросы.
Это значит, что вся эта функция проделывается, для того, что бы узнать код клавиши?
Эта вызывается функция 10h прерывания int 16h.
Что бы сделать, так что бы консольное приложение мс-дос оставалось на экране до тех пор пока не нажмется любая клавиша на клавиатуре.
А вопрос вот в чём.
Но зачем сюда загружается разные значения в разные в один регистр.
Вот выделил, те значения и регистры.
Цитата:
mov ah, 0
mov al, 3
int 10h
mov ax,0B800h
mov es,ax
mov di,0

mov ah,31
mov al,1
mov es:[di],ax
И ещё вопрос, какую функцию выполняет этот код:
mov ah,0h; загрузка числа 0h в регистр ah
mov al,3h; загрузка числа 3h в регистр al
int 10h; в справочнике посмотрел,что означает видео сервис.
Только те функции, что я написал

Последний раз редактировалось Reign; 21.02.2009 в 18:59.
Reign вне форума Ответить с цитированием
Старый 21.02.2009, 23:50   #9
ASSEMBLER
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 27
По умолчанию

код
Код:
mov ah, 0
mov al, 3
int 10h
устанавлмвает текущей нулевую видео страницу, на которую ты и выводишь символ путём прямого отображения в видеобуфер, а вообще просто прочитай книжку на несколько страниц дальше, там это всё есть, специально смотрел=)
А значения загружаются в разные части одного и того же регистра, и делается это просто для удобства и наглядности, ты можешь и одним числом в ах писать.
Программы на заказ Delphi, Pascal, С++, Assembler e-mail: greatrock@mail.ru
<--Если я вам помог не забываем жать на весы

Последний раз редактировалось ASSEMBLER; 21.02.2009 в 23:52.
ASSEMBLER вне форума Ответить с цитированием
Старый 22.02.2009, 13:07   #10
Reign
 
Регистрация: 22.07.2008
Сообщений: 9
По умолчанию

Сейчас хочу удостовериться правильно ли понимаю.
Цитата:
(1)CSEG segment
(2)org 100h
(3)beg:
(4)mov ah,0h
(5)mov al,3h
(6)int 10h
(7)
(8)mov ax,0b800h
(9)mov es,ax
(10)mov di,0
(11)mov ah,31
(12)mov al,1
(13)mov es:[di],ax
(14)
(15)mov ah,10h
(16)int 16h
(17)
(18)int 20h
(19)CSEG ends
(20)beg end
(1)- указывает на начало и название сегмента
(19)-указвает на конец этого же сегмента.
(2)-указывает на то что сегмент бедет отсчитываться с 100h смещения.
(3)-указывает на начало программы.
(20)-Указвает на конец программы.
(4),(5),(6)- указвают на устанавливание текущей нулевой видео страницы.
(8),(9) загружаем число 0b800h в сегментный регистр ES .
(10) - загружаем в регистр DI нуль.
(11),(12) - заноситься атрибут символа.(31- ярко-белый символ на синем фоне).В AL -ASC|| - код символа.(01- это рожица)
(13)- в строке заносим по адресу 0b800h:0000h(т.е. первый символ в первой строке дисплея - верхний левый угол) атрибут и ASC|| код символа(31 и 01 соответственно).
Это означает что атрибуты и расположение символа заносится в видео регистр 0b800h:0000h.
(15),(16)указваеют на то что бы программа ждала нажатия клавиши на клавиатуре.
(18)-указвает на то что сразу после выполнения функции программа вернётся туда откуда запускали.
Вот в этом списке для меня туманно выглядит строки (10),(11),(12),(13).
И ещё есть вопрос: Что означает число 0b800h?
Reign вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по книге PIKA4Y Microsoft Office Excel 5 03.02.2009 20:23
поиск листа в книге tat-besidovska Microsoft Office Excel 1 12.02.2008 11:00
Поиск в книге Andr Microsoft Office Excel 1 20.11.2007 21:47
Проблема в Гостевой книге Tempting HTML и CSS 4 10.02.2007 00:18
Поиск в книге asale Microsoft Office Excel 7 26.01.2007 07:29