Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler
Выпуск № 271
от 26.10.2005, 13:33
Администратор: | Калашников О.А. |
В рассылке: | Подписчиков: 264, Экспертов: 24 |
В номере: | Вопросов: 4, Ответов: 11 |
Вопрос № 28010: Всем добрый день! Уважаемые эксперты, не подскажите ли как заполнить видеобуфер элементами массива? Ниже я привел код в котором пытался это сделать но у меня ничего не получилось. И еще такая штука: я так понял, что если бы мне и удалось ...
Вопрос № 28022: title Start (exe) ;################################ ;Уважаемые эксперты подскажите пожалуйста что тут надо ;переделать или исправить? ;Я запускаю прогу из под FAR'а в режиме 50х80. В ходе работы прога ;переходит в 25х80(это так ...
Вопрос № 28028: Здравствуйте уважаемые эксперты. Не могли бы вы расказать об использовании математического сопроцессора в ассемблере, скажем о его включении, синтаксисе команд, используемых регистрах? Заранее благодарен....
Вопрос № 28040: Уважаемые эксперты, хотелось бы узнать, есть ли среди команд мат.сопроцессора команда действующая по аналогии с командой lea? К примеру, у меня есть вещественный массив. Как мне загрузить смещение первого элемента данного массива в регистр ST0?<...
Вопрос № 28.010 |
Всем добрый день! Уважаемые эксперты, не подскажите ли как заполнить видеобуфер элементами массива? Ниже я привел код в котором пытался это сделать но у меня ничего не получилось. И еще такая штука: я так понял, что если бы мне и удалось заполнить видеобуфер элементами массива при такой записи, то символы отображались черным цветом на черном фоне. т.е. ничего бы я не увидел. Как это обойти? Или у меня ошибочное предположение? Приложение: |
Отправлен: 20.10.2005, 17:16 Вопрос задал: Solodov Evgeniy Vladimirovich (статус: Посетитель) Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2) |
Отвечает: Евгений Иванов Здравствуйте, Solodov Evgeniy Vladimirovich! Используй команду MOVSB, ёлы палы! Или вот так: xor si,si xor di,di mov cx,255 go1: mov al, [ma + di] mov ah, 7 mov [es:si], ax add si,2 inc di; loop go1 удачи! --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 20.10.2005, 17:29 Оценка за ответ: 5 Комментарий оценки: Спасибо за ответ!:-) |
Отвечает: Юра Устинов Здравствуйте, Solodov Evgeniy Vladimirovich! Используйте строковые функции. Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS со смещением в SI, а строка-приемник — соответственно в ES:DI (или ES:EDI). Кроме того, все строковые команды работают только с одним элементом строки (байтом, словом или двойным словом) за один раз. Для того чтобы команда выполнялась над всей строкой, необходим один из префиксов повторения операций. Префикс: REP Назначение: Повторять Префикс: REPE Назначение: Повторять, пока равно Префикс: REPNE Назначение: Повторять, пока не равно Префикс: REPZ Назначение: Повторять, пока ноль Префикс: REPNZ Назначение: Повторять, пока не ноль Процессор: 8086 Все эти команды — префиксы для операций над строками. Любой из префиксов выполняет следующую за ним команду строковой обработки столько раз, сколько указано в регистре ЕСХ (или СХ, в зависимости от разрядности адреса), уменьшая его при каждом выполнении команды на 1. Кроме того, префиксы REPZ и REPE прекращают повторения команды, если флаг ZF сброшен в 0, и префиксы REPNZ и REPNE прекращают повторения, если флаг ZF установлен в 1. Префикс REP обычно используется с командами INS, OUTS, MOVS, LODS, STOS, а префиксы REPE, REPNE, REPZ и REPNZ — с командами CMPS и SCAS. Поведение префиксов не с командами строковой обработки не определено. Команда: MOVS приемник, источник Назначение: Копирование строки Процессор: 8086 Команда: MOVSB Назначение: Копирование строки байт Процессор: 8086 Команда: MOVSW Назначение: Копирование строки слов Процессор: 8086 Команда: MOVSD Назначение: Копирование строки двойных слов Процессор: 80386 Копирует один байт (MOVSB), слово (MOVSW) или двойное слово (MOVSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в память по адресу ES:EDI (или ES:DI). При использовании формы записи MOVS ассемблер сам определяет из типа указанных операндов (принято указывать имена копируемых строк, но можно использовать любые два операнда подходящего типа), какую из трех форм этой команды (MOVSB, MOVSW или MOVSD) выбрать. Используя MOVS с операндами, можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (SI) и EDI (DI) увеличиваются на 1, 2 или 4 (если копируются байты, слова или двойные слова), если флаг DF = 0, и уменьшаются, если DF = 1. При использовании с префиксом REP команда MOVS выполняет копирование строки длиной в ЕСХ (или СХ) байт, слов или двойных слов. Команда: LODS источник Назначение: Чтение из строки Процессор: 8086 Команда: LODSB Назначение: Чтение байта из строки Процессор: 8086 Команда: LODSW Назначение: Чтение слова из строки Процессор: 8086 Команда: LODSD Назначение: Чтение двойного слова из строки Процессор: 80386 Копирует один байт (LODSB), слово (LODSW) или двойное слово (LODSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в регистр AL, АХ или ЕАХ соответственно. При использовании формы записи LODS ассемблер сам определяет из типа указанного операнда (принято указывать имя строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (LODSB, LODSW или LODSD) выбрать. Используя LODS с операндом, можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:). После выполнения команды регистр ESI (SI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда LODS выполнит копирование строки длиной в ЕСХ (или СХ), что приведет к тому, что в аккумуляторе окажется последний элемент строки. На самом деле эту команду используют без префиксов, часто внутри цикла в паре с командой STOS, так что LODS считывает число, другие команды выполняют над ним какие-нибудь действия, а затем STOS записывает измененное число в то же место в памяти. Команда: STOS приемник Назначение: Запись в строку Процессор: 8086 Команда: STOSB Назначение: Запись байта в строку Процессор: 8086 Команда: STOSW Назначение: Запись слова в строку Процессор: 8086 Команда: STOSD Назначение: Запись двойного слова в строку Процессор: 80386 Копирует регистр AL (STOSB), AX (STOSW) или ЕАХ (STOSD) в память по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса). При использовании формы записи STOS ассемблер сам определяет из типа указанного операнда (принято указывать имя строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (STOSB, STOSW или STOSD) выбрать. После выполнения команды регистр EDI (DI) увеличивается на 1, 2 или 4 (если копируется байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда STOS заполнит строку длиной в ЕСХ (или СХ) числом, находящимся в аккумуляторе. --------- Спасём Россию!!! |
Ответ отправил: Юра Устинов (статус: 2-ой класс) Отправлен: 23.10.2005, 16:21 Оценка за ответ: 5 Комментарий оценки: Спасибо за ответ.:-) |
Вопрос № 28.022 |
title Start (exe) ;################################ ;Уважаемые эксперты подскажите пожалуйста что тут надо ;переделать или исправить? ;Я запускаю прогу из под FAR'а в режиме 50х80. В ходе работы прога ;переходит в 25х80(это так и должно быть), а при выходе снова ;вернувшись к режиму 50х80 содержимое начальной видеостраницы ;частично стирается. Если изначально ее запускать из-под 25х80, то ;всё нормально! ;################################ .model medium .stack 100h .code _start: mov ax,0083h ;переходим в режим 50х25 (+80h - экран не int 10h ;стирается) mov ah,0fh int 10h ;Определяем номер текущей видеостраницы push bx ;и заносим её в стек mov ah,05 mov al,03 ;делаем видеостраницу №3 активной int 10h mov ax,0600h ; mov bh,71h ;делаем экран белого цвета mov cx,0000 ; mov dx,184Fh ; int 10h ; mov ax,0B800h mov es,ax mov ah,71h ;синие символы на белом фоне mov al,0B0h ;символ mov di,12448 mov cx,1840 again: mov es:[di],ax inc di inc di ;Заполняем экран loop @again mov ah,00 int 16h pop ax ;Возврвщаем видеостраницу mov ah,05 int 10h mov ah,4ch int 21h end _start ;################################# ;Пробовал и сохранять содержимое экрана, а потом загружать - ;тот же результат. |
Отправлен: 20.10.2005, 19:46 Вопрос задал: Петров Максим Викторович (статус: Посетитель) Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 4) |
Отвечает: Лысков Игорь Витальевич Здравствуйте, Петров Максим Викторович! Я склоняюсь к мнению, что это элементарный глюк Far-а :( Перед выходом в видеобуфере лежит все как надо (я проверял - сохранял в файле все 4 страницы)! А вот Far, похоже, при восстановлении числа строк некорректно отрабатывает! Не надо забывать, что это виндушная программа, вся работа с экраном сделана ручками - возможны ошибки. У меня есть предложение: попробуй вначале прочитать число строк на экране, а в конце восстановить. Может поможет... Как это сделать, уже не помню, а искать лениво :). Ищи сам, или может кто-то подскажет... --------- Удачи! |
Ответ отправил: Лысков Игорь Витальевич (статус: 6-ой класс) Отправлен: 20.10.2005, 22:36 |
Отвечает: Евгений Иванов Здравствуйте, Петров Максим Викторович! Используй win32. А вообще - сохраняй содержимое страницы. И устанавливай видеорежим после сохранения!!! --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 21.10.2005, 23:32 |
Вопрос № 28.028 |
Здравствуйте уважаемые эксперты. Не могли бы вы расказать об использовании математического сопроцессора в ассемблере, скажем о его включении, синтаксисе команд, используемых регистрах? Заранее благодарен. |
Отправлен: 20.10.2005, 21:48 Вопрос задал: Юра (статус: Посетитель) Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Лысков Игорь Витальевич Здравствуйте, Юра! Тут в двух словах не скажешь... Читай, например, здесь: http://www.tesis.infotecstt.ru/docs/intel.486/html/index.htm Особенно главы 15, 17. 26... --------- Удачи! |
Ответ отправил: Лысков Игорь Витальевич (статус: 6-ой класс) Отправлен: 20.10.2005, 23:17 Оценка за ответ: 5 |
Отвечает: Master135 Здравствуйте, Юра! http://podgoretsky.com/ftp/Docs/Asm/AsmBradly/ книга Дэвид Дж. Брэдли Глава 7 отведена числовому сопроцессору 8087. В ней описываются дополнительные типы данных и команды, реализуемые 8087. В этой главе gриведено несколько примеров для демонстрации работы числового сопроцессора. |
Ответ отправил: Master135 (статус: 10-ый класс) Отправлен: 21.10.2005, 01:32 |
Отвечает: Юра Устинов Здравствуйте, Юра! В процессорах Intel все операции с плавающей запятой выполняет специальное устройство, FPU (Floating Point Unit), с собственными регистрами и собственным набором команд, поставлявшееся сначала в виде сопроцессора (8087, 80287, 80387, 80487), а начиная с 80486DX — встраивающееся в основной процессор. FPU полностью соответствует стандартам IEEE 754 и (начиная с 80486) IEEE 854. Числовой процессор может выполнять операции с семью разными типами данных, представленными в таблице 9, — три целых двоичных, один целый десятичный и три типа данных с плавающей запятой. Тип данных Бит Количество значащих цифр Пределы Целое слово 16 4 -32768 — 32767 Короткое целое 32 9 -2*109 — 2*109 Длинное целое 64 18 -9*1018 — 9*1018 Упакованное десятичное 80 18 -99..99 — +99..99 (18 цифр) Короткое вещественное 32 7 1.18*10-38 — 3.40*1038 Длинное вещественное 64 15—16 2.23*10-308 — 1.79*10308 Расширенное вещественное 80 19 3.37*10-4932 — 1.18*104932 Вещественные числа хранятся, как и все данные, в форме двоичных чисел. Двоичная запись числа с плавающей запятой аналогична десятичной, только позиции справа от запятой соответствуют не делению на 10 в соответствующей степени, а делению на 2. Переведем для примера в двоичный вид число 0,625: 0,625 - 1/2 = 0,125 1/4 больше, чем 0,125 0,125 - 1/8 = 0 Итак, 0,625 = 0,101b. При записи вещественных чисел всегда выполняют нормализацию — умножают число на такую степень двойки, чтобы перед десятичной точкой стояла единица, в нашем случае 0,625 = 0,101b = 1,01b * 2-1 Говорят, что число имеет мантиссу 1,01 и экспоненту -1. Как можно заметить, при использовании этого алгоритма первая цифра мантиссы всегда равна 1, так что ее можно не писать, увеличивая тем самым точность представления числа дополнительно на 1 бит. Кроме того, значение экспоненты хранят не в виде целого со знаком, а в виде суммы с некоторым числом так, чтобы хранить всегда только положительное число и чтобы было легко сравнивать вещественные числа — в большинстве случаев достаточно сравнить экспоненту. Теперь мы можем рассмотреть вещественные форматы IEEE, используемые в процессорах Intel: короткое вещественное: бит 31 — знак мантиссы, биты 30 – 23 — 8-битная экспонента + 127, биты 22 – 0 — 23-битная мантисса без первой цифры; длинное вещественное: бит 63 — знак мантиссы, биты 62 – 52 — 11-битная экспонента + 1024, биты 51 – 0 — 52-битная мантисса без первой цифры; расширенное вещественное: бит 79 — знак мантиссы, биты 78 – 64 — 15-битная экспонента + 16 383, биты 63 – 0 — 64-битная мантисса с первой цифрой (то есть бит 63 равен 1). FPU выполняет все вычисления в 80-битном расширенном формате, а 32- и 64-битные числа используются для обмена данными с основным процессором и памятью. Кроме обычных чисел формат IEEE предусматривает несколько специальных случаев, которые могут получаться в результате математических операций и над которыми также можно выполнять некоторые операции: положительный ноль: все биты числа сброшены в ноль; отрицательный ноль: знаковый бит — 1, все остальные биты — нули; положительная бесконечность: знаковый бит — 0, все биты мантиссы — 0, все биты экспоненты — 1; отрицательная бесконечность: знаковый бит — 1, все биты мантиссы — 0, все биты экспоненты — 1; денормализованные числа: все биты экспоненты — 0 (используются для работы с очень маленькими числами — до 10-16445 для расширенной точности); неопределенность: знаковый бит — 1, первый бит мантиссы (первые два для 80-битных чисел) — 1, а остальные — 0, все биты экспоненты — 1; не-число типа SNAN (сигнальное): все биты экспоненты — 1, первый бит мантиссы — 0 (для 80-битных чисел первые два бита мантиссы — 10), а среди остальных бит есть единицы; не-число типа QNAN (тихое): все биты экспоненты — 1, первый бит мантиссы (первые два для 80-битных чисел) — 1, среди остальных бит есть единицы. Неопределенность — один из вариантов QNAN; неподдерживаемое число: все остальные ситуации. Остальные форматы данных FPU также допускают неопределенность — единица в старшем бите и нули в остальных для целых чисел, и старшие 16 бит — единицы для упакованных десятичных чисел. FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров. Регистры данных (R0 – R7) не адресуются по именам, как регистры основного процессора. Вместо этого эти восемь регистров рассматриваются как стек, вершина которого называется ST, а более глубокие элементы — ST(1), ST(2) и так далее до ST(7). Если, например, в какой-то момент времени регистр R5 называется ST (рис. 13), то после записи в этот стек числа оно будет записано в регистр R4, который станет называться ST, R5 станет называться ST(1) и т.д. К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны, как ММ0 – ММ7. Регистр состояний SR содержит слово состояния FPU: --------- Спасём Россию!!! |
Ответ отправил: Юра Устинов (статус: 2-ой класс) Отправлен: 23.10.2005, 16:02 |
Вопрос № 28.040 |
Уважаемые эксперты, хотелось бы узнать, есть ли среди команд мат.сопроцессора команда действующая по аналогии с командой lea? К примеру, у меня есть вещественный массив. Как мне загрузить смещение первого элемента данного массива в регистр ST0? Заранее благодарен. |
Отправлен: 21.10.2005, 02:11 Вопрос задал: Юра (статус: Посетитель) Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Евгений Иванов Здравствуйте, Юра! Адресация применяется такая же, как и для обычных команд. --------- Что имеем - не храним, потерявши - плачем |
Ответ отправил: Евгений Иванов (статус: Профессор) Отправлен: 21.10.2005, 08:10 |
Отвечает: Лысков Игорь Витальевич Здравствуйте, Юра! Есть все же некоторое отличие: В регистры сопроцессора всегда грузят только значение, адресуемые любым возможным способом. Если нужно адресовать, то используй обычные регистры. --------- Удачи! |
Ответ отправил: Лысков Игорь Витальевич (статус: 6-ой класс) Отправлен: 21.10.2005, 10:13 |
Отвечает: Князев Алексей Анатольевич Здравствуйте, Юрa! попробуй так Mov dx, offset label |
Ответ отправил: Князев Алексей Анатольевич (статус: 1-ый класс) Отправлен: 21.10.2005, 10:56 |
Отвечает: Юра Устинов Здравствуйте, Юра! У зубкова об этом хорошо написано! --------- Спасём Россию!!! |
Ответ отправил: Юра Устинов (статус: 2-ой класс) Отправлен: 23.10.2005, 16:03 |
© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.
Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки:
comp.soft.prog.faq
Архив рассылки
Отписаться
Вспомнить пароль
В избранное | ||