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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.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


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

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

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

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

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


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


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

Rambler's Top100 Яндекс


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

В избранное