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

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


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

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

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

Выпуск № 273
от 28.10.2005, 13:57

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


Вопрос № 28141: Уважаемые Эксперты,раскажите,пожалуйста подробно, как вывести одновременно в контр.AT89C2051 ,на одну ногу 700 гц,на другую 900 гц, на третью 1100,...1300,...1500,...1700 гц . форма синус ,а если нет то цифра. Спасибо....
Вопрос № 28150: Разбирался в программе, которая выводит список блоков памяти MS-DOS, по книжке Фролова. Но там код на С. Хотелось бы получить код на ассемблере. И желательно для вывода информации о блоке использовать средства BIOS. Разъяните подробно как написат...

Вопрос № 28.141
Уважаемые Эксперты,раскажите,пожалуйста подробно, как вывести одновременно в контр.AT89C2051 ,на одну ногу 700 гц,на другую 900 гц, на третью 1100,...1300,...1500,...1700 гц . форма синус ,а если нет то цифра. Спасибо.
Отправлен: 22.10.2005, 23:37
Вопрос задал: Pettimm (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Bob Johnson
Здравствуйте, Pettimm!
Насколько я понимаю, такого количество таймеров в контроллере нет? Тогда частоты необходимо синтезировать. Формула синусоиды:
y = a*sin (2*pi*f*t), где
y - выходной сигнал,
a - амплитуда,
f - частота,
t - время.
Дальше создается цикл, который выводит на каждую ногу контроллера (а там цапы стоят?) выходной сигнал ("у" в формуле) и увеличивает значение времени t. Чем больше раз в секунду данный цикл сможет выполняться, чем больше будет частота дискретизации, а значит синусоиды получатся более качественными. Для синтеза частоты 1700 гц более менее синусоидальной формы необходимо, чтобы цикл мог выполняться хотя бы по 8 раз на один период сигнала (т.е. 1700*8 раз в секунду).
Естественно, что считать синус "на лету" слишком долго, поэтому на практике создают в памяти таблицу синуса. Удобно, чтобы ее размер был равен 2^n, где n - какое либо число, например 8. Формулу в приведенном мной виде опять же использовать нецелесообразно, т.к. всех этих умножений можно избежать. Вот пример на асме х86, под контроллер переведешь сам (см. приложение).
В программе используется 256-ти байтная таблица синуса, каждый байт которой представляет отдельное значение. переменная sin1pos содержит "позицию" первого генератора. Старшие 8 бит позиции отражают реальную позицию в таблице синуса, а младшие 24 используются для повышения точности синтезируемой частоты. Скорость sin1spd определяет выходную частоту и рассчитывается исходя из того, сколько раз в секунду будет выполняться данный цикл (на контроллере можно либо повесить его на прерывание, которое вызывать с заданной частотой по таймеру, либо просто рассчитать скорость выполнения исходя из количества тактов требуемых для каждой команды и тактовой частоты (на спектруме можно было применять только второй вариант)). Если, например, ты хотел бы синтезировать частоту 1 Гц, а цикл выполнялся бы у тебя 256 раз в секунду, то скорость должна была бы быть равна 0х01000000. Если бы 512 раз в секунду - то 0х00800000 и т.п.

Приложение:

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 23.10.2005, 18:34
Оценка за ответ: 5
Комментарий оценки:
Приятно получать достаточно подробные ответы,но надо попробовать практически и думаю,что по этому поводу будут еще вопросы,ведь опыт пока не большой...Благодорю! Творческих вам успехов.


Вопрос № 28.150
Разбирался в программе, которая выводит список блоков памяти MS-DOS, по книжке Фролова. Но там код на С. Хотелось бы получить код на ассемблере. И желательно для вывода информации о блоке использовать средства BIOS.
Разъяните подробно как написать на ассемблере.
Отправлен: 23.10.2005, 00:27
Вопрос задал: Jnshish (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Юра Устинов
Здравствуйте, Jnshish!
Как я правильно понимаю, то для вывода информации о блоках памяти (А теперь внимательно) в ДОС, в BIOS не должно быть никаких функций. BIOS оправдывает своё название (Базавая система ввода вывода) и содержит только функции для работы с устройствами.
Насчёт инфы по блокам памяти:
До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там есть еще хотя бы 64 килобайта свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти — выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).

Функция DOS 48h — Выделить память

Ввод: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Вывод: CF = 0, если блок выделен
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка:
АХ = 7 — блоки управления памятью разрушены
АХ = 8 — недостаточно памяти:
ВХ = размер максимального доступного блока
Эта функция с большим значением в ВХ (обычно FFFFh) используется для определения размера самого большого доступного блока памяти.

Функция DOS 49h — Освободить память

Ввод: АН = 49h
ES = сегментный адрес освобождаемого блока
Вывод: CF = 0, если блок освобожден
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 9, если в ES содержится неверный адрес
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.

Функция DOS 4Ah — Изменить размер блока памяти

Ввод: АН = 4Ah
ВХ = новый размер в 16-байтных параграфах
ES = сегментный адрес модифицируемого блока
Вывод: CF = 0, если размер блока изменен
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 8, если не хватает памяти (при увеличении),
АХ = 9, если ES содержит неверный адрес
ВХ = максимальный размер, доступный для этого блока
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела.

При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS-DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB — неиспользуемых участках памяти выше 640 Кб и ниже 1 Мб, для этого требуется сначала подключить UMB к менеджеру памяти и изменить стратегию выделения памяти с помощью функции DOS 58h.

Про UMB
Функция DOS 58h — Считать/изменить стратегию выделения памяти

Ввод: АН = 58h
AL = 00h — считать стратегию
AL = 01h — изменить стратегию
ВХ = новая стратегия
биты 2 – 0:
00 — первый подходящий блок
01 — наиболее подходящий блок
11 — последний подходящий блок
биты 4 – 3:
00 — обычная память
01 — UMB (DOS 5.0+)
10 — UMB, затем обычная память (DOS 5.0+)
AL = 02h — считать состояние UMB
AL = 03h — установить состояние UMB
ВХ = новое состояние: 00 — не используются, 01 — используются
Вывод: CF = 0, АХ = текущая стратегия для AL = 0, состояние UMB для AL = 2
CF = 1, AX = 01h, если функция не поддерживается (если не запущен менеджер памяти (например, EMM386) или нет строки DOS = UMB в CONFIG.SYS
Если программа изменяла стратегию выделения памяти или состояние UMB, она обязательно должна их восстановить перед окончанием работы

---------
Спасём Россию!!!
Ответ отправил: Юра Устинов (статус: 2-ой класс)
Отправлен: 23.10.2005, 15:55

Отвечает: Лысков Игорь Витальевич
Юра Устинов:
Что-то ты не то ответил...Человеку надо получить список MCB, А ты ему даешь команды для работы с блоками памяти. Близко, но не то :(

Здравствуйте, Jnshish!
Бери программку, когда-то баловался подобным. Кое-что сохранилось...
Она формирует файлик. Добавить вывод на экран средствами int 10h (читай средствами BIOS) - ну это уже сам потрудись...:)

Приложение:

---------
Удачи!

Ответ отправил: Лысков Игорь Витальевич (статус: 6-ой класс)
Отправлен: 23.10.2005, 16:47


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

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

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

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

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


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


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

Rambler's Top100 Яндекс


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

В избранное