Консультация № 63939
23.11.2006, 23:58
0.00 руб.
0 4 1
я слышал про разные ноты (тони?) звуков в ассемблере. Как это зделать?
Я в ассемблере вообще не понимаю.
Пишу на си.
Буду ползоватса вставкой кода на ассемблере (__asm)
зарание спасибо

Обсуждение

Неизвестный
24.11.2006, 11:33
общий
Об этом есть, например, в известной отличной книге Зубков "Ассемблер. Программирование для DOS, Windows и UNIX". Есть, например, по адресуhttp://forum.everyday.by/index.php?s=63d7d0128f3309085d26f534b441b80a&act=Attach&type=post&id=1230Спросите, может есть в библиотеке. И еще учебник Юрова по ассемблеру
Неизвестный
24.11.2006, 19:30
общий
Что такое "разные ноты (тони?) звуков в ассемблере"?О чем идет речь?
Неизвестный
24.11.2006, 21:14
общий
это ответ
Здравствуйте, ISS!
Насколько я понял вы имеете ввиду использование встроенного динамика. Для дос-используются порты:пример в приложении(в WinNT доступ к портам из ring-3 закрыт-работать, при вставке в Win-программу, не будет).Компилировать:tasm.exe <имя файла>.asm tlink.exe <имя файла>.obj -получите рабочую =досовскую= программу. Для Win всё намного проще: есть API-функция:
BOOL Beep(

DWORD dwFreq, // частота звука, в герцах
DWORD dwDuration // длительность звучания, в миллисекундах
);
Для си-самое то, можно обойтись и без асм-вставок.
С уважением, IceW0|f.


Приложение:
;-Prg_7_l.asn;Программа,имитирующая звук сирены.;Изменение высоты звука от 450 до 2100 Гц.;Используется макрос delay (задержка).;При необходимости;можно поменять значение задержки (по умолчанию - для процессораPentium).masmmodel smallstack 100h;макрос задержки, его текст ограничивается директивами macro и endm.;На входе — значение задержки (в икс)delay macro timelocal ext, iterpush cxmov cx, timeext:push cxmov cx,5000iter:loop iterpop cxloop extPop cxendm.data; сегмент данныхtonelow dw 2651 ;нижняя граница звучания 450 Гцcnt db 0; счетчик для выхода из программыtemp dw 7;верхняя граница звучания.code ;сегмент кодаmain: ;точка входа в программуmov ax ,@data ;связываем регистр ds с сегментомmov ds, ax ;данных через регистр ахmov ax ,0 ;очищаем ахgo: ;заносим слово состояния 10110110b(0B6h) в командный регистр (порт 43h)mov al,0B6hout 43h,alin al,61h ;получим значение порта 61h в alor al,3 ;инициализируем динамик и подаем ток в порт 61hout 61h,almov cx,2083 ;количество шагов ступенчатого изменения тонаmusicup:;в ах значение нижней границы частотыmov ax,tonelowout 42h,al ;в порт 42п младшее слово ax:alxchg al,ah ;обмен между al и ahout 42h,al ;в порт 42h старшее слово ах:ahadd tonelow,1 ;повышаем тонdelay 1 ;задержка на 1 мксmov dx,tonelow ;в dx текущее значение высотыmov temp,dx ;temp — верхнее значение высотыloop musicup ;повторить цикл повышенияmov cx,2083 ;восстановить счетчик циклаmusicdown:mov ax,temp ;в ах верхнее значение высотыout 42h,al ;в порт 42h младшее слово ax:almov al,ah ;обмен между al и ahout 42h,al ;в порт 42h старшее слово ax:ahsub temp,1 ;понижаем высотуdelay 1 ;задержка на 1 мксloop musicdown ;повторить цикл пониженияnosound:in al,61h ;получим значение порта 61h в ALand al,0FCh ;выключить динамикout 61h,al ;в порт 61hmov dx,2651 ;для последующих цикловmov tonelow,dxinc cnt ;увеличиваем счетчик проходов, то есть количество звучаний сиреныcmp cnt,5 ;5 раз ?jne go ;если нет, идти на метку goexit:mov ax, 4C00h;стандартный выходint 21hend main ;конец программы
Неизвестный
25.11.2006, 14:46
общий
2 - Волков Павел ЮрьевичВидимо товарищь ISS задающий вопрос не понимает чтобы получить ноту нужно задать Высоту тона. Хотя может и знает....Я чесно говоря не помню, но помойму нота ЛЯ например имеет высоту 440 гц ну и тд и тп.))))А лучше справочник начинающего музыканта почитать. Вот - http://veter.tyumen.ru/cgi-bin/view.cgi?&where=letters&action=view&txt_id=1109314759&page=new
Форма ответа