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

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


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

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

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

Выпуск № 276
от 03.11.2005, 13:36

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


Вопрос № 28454: есть следущяя проблема при записи в видеобуфер в/карты под ХР выскакивает ошибка или вообще нечего на экране не отображаеться пробовал и из под дос результат тотже Подскажите алгорит вывода на экран текста АНСИ2 (для фасма если не сложно)...
Вопрос № 28472: Здравствуйте, начал изучать ассамблер, но зашел в тупик.. Объясните пожалуйста, если можно на пальцах (для полного чайника), что такое сегменты, вообще какова их цель, как их используют... в общем все что можно, буду благодарен любой информации о...
Вопрос № 28494: Здравствуйте, не могли бы помочь новичку. Пытаюсь откомпилить первую прогу из рассылки, через masm. ml.exe prog.asm /AT Exe-шник получаеться, однако когда его запускаешь вылазиет окошко: 16 - разрядная подсистема MS-DOS prog...

Вопрос № 28.454
есть следущяя проблема при записи в видеобуфер в/карты под ХР
выскакивает ошибка или вообще нечего на экране не отображаеться
пробовал и из под дос результат тотже
Подскажите алгорит вывода на экран текста АНСИ2 (для фасма если не сложно)
Отправлен: 28.10.2005, 16:50
Вопрос задал: Thedron (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Евгений Иванов
Здравствуйте, Thedron!

TextOut

The TextOut function writes a character string at the specified location, using the currently selected font.

BOOL TextOut(

HDC hdc, // handle of device context
int nXStart, // x-coordinate of starting position
int nYStart, // y-coordinate of starting position
LPCTSTR lpString, // address of string
int cbString // number of characters in string
);



---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 28.10.2005, 16:54

Отвечает: Юра Устинов
Здравствуйте, Thedron!
Для фасма не подскажу, но вообще делается так, текстовый видеобуфер находится по адресу B800h:0000h, переходишь в текстовый режим
mov ax,3
int 10h
mov ax,0b800h
mov es,ax
xor di,di ;устанавливаем смешение в пределах сегмента 0000х
mov al,1
stosb
stosb
xor ax,ax
int 16h
Вроде должно работать...Сей час посмотрю...
Работает, рисует синючую морду!
Удачи!
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 3-ий класс)
Отправлен: 29.10.2005, 19:23


Вопрос № 28.472
Здравствуйте, начал изучать ассамблер, но зашел в тупик..
Объясните пожалуйста, если можно на пальцах (для полного чайника), что такое сегменты, вообще какова их цель, как их используют... в общем все что можно, буду благодарен любой информации о сегментации (во сказал...) памяти.
Заранее огромное спасибо!!!
Отправлен: 29.10.2005, 00:55
Вопрос задал: Железняков Виктор Михайлович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Железняков Виктор Михайлович!
Сегменты устарели. Использовались в старых системах. Сейчас используется страничная защита памяти, хотя в сочетании и с сегментной.

Я имею в виду, что сегменты на втором плане. Они совершенно прозрачны в программе. Так что забудь о них и не думай, а создавай алгоритм непосредственно!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 29.10.2005, 07:08

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Железняков Виктор Михайлович!
Я согласен с Евгением Ивановым в том, что сегменты устарели. Под ДОС сейчас никто не пишет.
Но не согласен в том, что не надо знать и понимать.
Сегментация появилась как вынужденная мера разработчиков Intel-а. Ведь все пошло с 16-разрядных процев 8086/8088. 16-разрядная шина способна адресовать только 64к, а в первых компах было 1Мб памяти. Как адресовать? Вот и придумали внутри проца использовать 20-битную шину (чтобы адресовать 1Мб), а адрес получать как сумму значения специальных регистров(сегментных), сдвинутых на 4 бита влево и смещения. Например, 1234h:5678h = 12340h+5678h = 179B8h
В свете этого и приняли, что сегментный регистр адресует сегмент памяти, а смещение - адрес относительно начала этого сегмента.
По определению, размер сегмента не может быть больше 64к (и не меньше 16 байт), поэтому чтобы получить доступ к коду за пределами сегмента надо делать дальные переходы со сменой сегмента, для доступа к данным - загружать сегментные регистры нужным значением.
Согласись, не очень удобно...Но это была вынужденная мера.

Как еще используется подобная адресация? Например, для того, чтобы программа работала с любого адреса (кратного 16), достаточно просто загрузить ее в соответствующий сегмент(ну еще кое-что сделать, пока не важно). Смещения, используемые в программе, будут одинаково работать в любом сегменте
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 6-ой класс)
Отправлен: 29.10.2005, 15:39

Отвечает: Юра Устинов
Kаждая программа, написанная на любом языке программирования, состоит из одного или нескольких сегментов. Обычно область памяти, в которой находятся команды, называют сегментом кода, область памяти с данными — сегментом данных и область памяти, отведенную под стек, — сегментом стека. Разумеется, ассемблер позволяет изменять устройство программы как угодно — помещать данные в сегмент кода, разносить код на множество сегментов, помещать стек в один сегмент с данными или вообще использовать один сегмент для всего.
Сегмент программы описывается директивами SEGMENT и ENDS.
имя_сегмента segment readonly выравн. тип разряд 'класс'
...
имя_сегмента ends
Имя сегмента — метка, которая будет использоваться для получения сегментного адреса, а также для комбинирования сегментов в группы.
Все пять операндов директивы SEGMENT необязательны.
READONLY. Если этот операнд присутствует, MASM выдаст сообщение об ошибке на все команды, выполняющие запись в данный сегмент. Другие ассемблеры этот операнд игнорируют.
Выравнивание. Указывает ассемблеру и компоновщику, с какого адреса может начинаться сегмент. Значения этого операнда:
BYTE — с любого адреса;
WORD — с четного адреса;
DWORD — с адреса, кратного 4;
PARA — с адреса, кратного 16 (граница параграфа);
PAGE — с адреса, кратного 256.
По умолчанию используется выравнивание по границе параграфа.
Тип. Выбирает один из возможных типов комбинирования сегментов:
тип PUBLIC (иногда используется синоним MEMORY) означает, что все такие сегменты с одинаковым именем, но разными классами будут объединены в один;
тип STACK — то же самое, что и PUBLIC, но должен использоваться для сегментов стека, потому что при загрузке программы сегмент, полученный объединением всех сегментов типа STACK, будет использоваться как стек;
сегменты типа COMMON с одинаковым именем также объединяются в один, но не последовательно, а по одному и тому же адресу, следовательно, длина суммарного сегмента будет равна не сумме длин объединяемых сегментов, как в случае PUBLIC и STACK, а длине максимального. Таким способом иногда можно формировать оверлейные программы;
тип AT — выражение указывает, что сегмент должен располагаться по фиксированному абсолютному адресу в памяти. Результат выражения, использующегося в качестве операнда для AT, равен этому адресу, деленному на 16. Например: segment at 40h — сегмент, начинающийся по абсолютному адресу 0400h. Такие сегменты обычно содержат только метки, указывающие на области памяти, которые могут потребоваться программе;
PRIVATE (значение по умолчанию) — сегмент такого типа не объединяется с другими сегментами.
Pазрядность. Этот операнд может принимать значения USE16 и USE32. Размер сегмента, описанного как USE16, не может превышать 64 Кб, и все команды и адреса в этом сегменте считаются 16-битными. В этих сегментах все равно можно применять команды, использующие 32-битные регистры или ссылающиеся на данные в 32-битных сегментах, но они будут использовать префикс изменения разрядности операнда или адреса и окажутся длиннее и медленнее. Сегменты USE32 могут занимать до 4 Гб, и все команды и адреса в них по умолчанию 32-битные. Если разрядность сегмента не указана, по умолчанию используется USE16 при условии, что перед директивой .MODEL не применялась директива задания допустимого набора команд .386 или старше.
Класс сегмента — это любая метка, взятая в одинарные кавычки. Все сегменты с одинаковым классом, даже сегменты типа PRIVATE, будут расположены в исполняемом файле непосредственно друг за другом.
Для обращения к любому сегменту следует сначала загрузить его сегментный адрес (или селектор в защищенном режиме) в какой-нибудь сегментный регистр. Если в программе определено много сегментов, удобно объединить несколько сегментов в группу, адресуемую с помощью одного сегментного регистра:
имя_группы group имя_сегмента...
Операнды этой директивы — список имен сегментов (или выражений, использующих оператор SEG), которые объединяются в группу. Имя группы теперь можно применять вместо имен сегментов для получения сегментного адреса и для директивы ASSUME.
assume регистр:связь...
Директива ASSUME указывает ассемблеру, с каким сегментом или группой сегментов связан тот или иной сегментный регистр. В качестве операнда «связь» могут использоваться имена сегментов, имена групп, выражения с оператором SEG или слово «NOTHING», означающее отмену действия предыдущей ASSUME для данного регистра. Эта директива не изменяет значений сегментных регистров, а только позволяет ассемблеру проверять допустимость ссылок и самостоятельно вставлять при необходимости префиксы переопределения сегментов, если они необходимы.
Перечисленные директивы удобны для создания больших программ на ассемблере, состоящих из разнообразных модулей и содержащих множество сегментов. В повседневном программировании обычно используется ограниченный набор простых вариантов организации программы, известных как модели памяти.
При использовании каждой из сегментированных моделей памяти для формирования любого адреса применяются два числа — адрес начала сегмента и смещение искомого байта относительно этого начала (в бессегментной модели памяти flat адреса начал всех сегментов равны). Операционные системы (кроме DOS) могут размещать сегменты, с которыми работает программа пользователя, в разных местах в памяти, и даже могут временно записывать их на диск, если памяти не хватает. Так как сегменты могут оказаться где угодно, программа обращается к ним, используя вместо настоящего адреса начала сегмента 16-битное число, называемое селектором. В процессорах Intel предусмотрено шесть шестнадцатибитных регистров — CS, DS, ES, FS, GS, SS, используемых для хранения селекторов. (Регистры FS и GS отсутствовали в 8086, но появились уже в 80286.) Это не значит, что программа не может одновременно работать с большим количеством сегментов памяти, — в любой момент времени можно изменить значения, записанные в этих регистрах.
---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 3-ий класс)
Отправлен: 29.10.2005, 19:22


Вопрос № 28.494
Здравствуйте, не могли бы помочь новичку.
Пытаюсь откомпилить первую прогу из рассылки, через masm.
ml.exe prog.asm /AT
Exe-шник получаеться, однако когда его запускаешь вылазиет окошко:

16 - разрядная подсистема MS-DOS
prog01.exe
Процессор NTVDM обнаружил недопустимую инструкцию.
CD:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения работы приложения нажмите кнопку "Закрыть"

Операционка у меня Xp, процессор Atlon если это важно, но вроде бы набор команд что у него , что у Pentium должен быть одинаков.
Помогите кто чем может!

Спасибо.
Отправлен: 29.10.2005, 13:36
Вопрос задал: Клименков (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Евгений Иванов
Здравствуйте, Клименков!
как я помню, F0 это LOCK.
зачем тебе это?

Приложение:

---------
Что имеем - не храним, потерявши - плачем

Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 29.10.2005, 13:41

Отвечает: Sager
Здравствуйте, Клименков!
Вообще-то получается не экзешник, а com-файл.
нужен исходник, наверное там где-то ошибка
Ответ отправил: Sager (статус: Студент)
Отправлен: 29.10.2005, 19:00

Отвечает: Стас
Здравствуйте, Клименков!
Ну что вы в самом деле, что ты, что Thedron.
Как нам догадаться что у вас там с прогами не так.

Обязательно прикладывайте текст проги, текст ошибки, и команды компиляции.
Тогда разберемся, а так.... много вариантов.
Ответ отправил: Стас (статус: Специалист)
Отправлен: 30.10.2005, 00:35


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

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

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

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

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


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


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


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

В избранное