Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.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 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки:
comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль
В избранное | ||