Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2013, 23:28   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Не компилируется мелодия на ASM

Нашел исходники в инете,может даже на вашем сайте.
Пробовал FASM,MASM и NASM - все они выдают различные ошибки.
Код:
;=================
;= сегмент стека =
;=================
mary_stack SEGMENT PARA STACK 'stack'
	db 64 dup('stack')
mary_stack ENDS   
;==================
;= сегмент данных =
;==================
mary_data SEGMENT PARA	PUBLIC 'data'
; время задержки  
mary_time dw 6 dup (25), 50
	  dw 2 dup (25, 25), 50, 25, 25, 50
	  dw 12 dup (25), 100
; цельная нота, это 100 (1 сек), половинная 50, 25 это четверть, и т. д.
;++++++++++++++++++++++
; мелодия мери    
mary_freq dw 330, 294, 262, 293, 3 dup(330)	; 1-2 такт
	  dw 3 dup(294), 330, 2 dup(392)	; 3-4 такт
	  dw 330, 294, 262, 294, 4 dup (330)	; 5-6 такт
	  dw 2 dup (294), 330, 294, 262, 0FFFFh ; 7-8 такт
; нота соответствуют частотам
; до 130,8        
; диез 138,6      
; ре 146,8        
; ми 164,8        
; диез 155,6      
; фа 174,8        
; соль 196        
; диез 185        
; ля 220          
; диез 207,7      
; си 246,9        
; ----------      
; до 261          
; диез 277,2      
; ре 293,7        
; диез 311,1      
; ми 329,6        
; фа 349,2        
; диез 370        
; соль 392        
; диез 415        
; ля 440          
; диез 464,2      
; cи 493,9        
mary_data ENDS	  
;================ 
;= сегмент кода = 
;================ 
mary_code SEGMENT PARA PUBLIC 'code'
		  
mary proc far	  
assume CS: mary_code, DS: mary_data, SS: mary_stack
	push DS   
	xor ax, ax   ; обнуляем ax
	push ax      ; DS:0000 по нему будем выходить в ОС
		  
	mov ax, mary_data ; явно определим сегмент данных
	mov DS, ax
	; подготовим все для проигрыша звука, т. е.
	lea si, mary_freq   ; загрузим в si массив мелодии
	call play	    ; запускаем процедуру play
       ret	  
mary endp	  
		  
; Процедра play проигрывает мелодию
; в регистре si должен находиться адрес массива мелодии
play proc near	  
	push ax 	  ; cохраняем регистры
	push di   
	push si   
	push bp   
       @freq:	  
	 mov di, [si]	  ; загружаем в di следующую ноту
	 cmp di, 0FFFFh   ; сравниваем, не конец ли? (0FFFFh признак окончания)
	 je @end_play	  ; если конец, то заканчиваем проигрывать
			  ; если нет, то воспроизведем звук
	 mov bx, mary_time+bp
	 call sound	  ; вызвав процедуру sound
	 add si, 2	  ; ставим указатель на следующую ноту
	 add bp, 2	  ; и соответственно на следующий такт
	 jmp @freq	  ; прыгаем на следующий проигрыш ноты
		  
       @end_play: 
	 pop bp 	  ; восстанавливаем регистры
	 pop si   
	 pop di   
	 pop ax   
      ret	  
play endp	  
		  
; процедура sound проигрывает звук
; в di соответствущая нота
; в bx задержка   
sound proc near   
	push ax       ; сохраним регистры
	push bx   
	push cs   
	push dx   
	push di   
		  
	mov al, 0BCh
	out 43h, al	   ; запишем в al значение таймера
	mov dx, 14h	   ; делитель времени
	mov ax, 4F33h	   ; 1331000 делить на частоту
	div di	  
	out 42h, al	   ; младший байт счетчика таймера
	mov al, ah
	out 42h, al
	in al, 61h
	mov ah, al
	or al, 3	   ; включаем динамики
	out 61h, al
	@waits: 	   ; делаем задержку
	 mov cx, 10000	   ; в 10 милисекунд
	 loop $   
	 dec bx 	   ; пока не кончиться bx
	 jnz @waits	   ; будем выводить звук
	mov al, ah
	out 61h, al	   ; восстанавливаем порт в начальное состояник
		  
	pop di	      ; восстановим регистры
	pop dx	  
	pop cx	  
	pop bx	  
	pop ax	  
       ret	  
sound endp	  
mary_code ENDS	  
	  END mary
calypso вне форума Ответить с цитированием
Старый 02.07.2013, 08:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знаю, старым антикварным tasm (tasm.zip) всё скомпилировалось и собралось в рабочий EXE вообще без проблем..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.07.2013, 10:14   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

calypso, в таких случаях нужно прежде всего сообщения ассемблера об ошибках показывать, код уже второе.
vadimych вне форума Ответить с цитированием
Старый 02.07.2013, 10:47   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
push ax ; сохраним регистры
push bx
push cs
push dx
push di
А что если заменить на PUSHA/POPA?
Вот точно не помню, но заработает ли такой код в Win7? В ней, если я не ошибаюсь нужно работать через Beep из WinAPI.
---
Вот такой вопрос на засыпку. Можно ли параллельно воспроизводить звуки в спикере? Аккорды, например. Есть конечно предположение, что он не может работать асинхронно, но все же.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.07.2013, 13:42   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну к примеру FASM последней версии выдает такую ошибку:
calypso вне форума Ответить с цитированием
Старый 02.07.2013, 13:46   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

TASM выдает вот что:
Assembling file: OVECHKA_MARY.ASM
**Fatal** Command line: Can't locate file: OVECHKA_MARY.ASM
Error messages: 1
Warning messages: None
Remaining memory: 400k

PS Получилось,делал как тут написано:
http://stilus-doctus.narod.ru/tasm/tasm_2.html
TASM ещё оказывается длинные названия файлов не видит,нужно переименовать в 8 символов или короче

Последний раз редактировалось calypso; 02.07.2013 в 13:59.
calypso вне форума Ответить с цитированием
Старый 02.07.2013, 15:19   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
TASM ещё оказывается длинные названия файлов не видит,нужно переименовать в 8 символов или короче
ну, вот, если бы сразу сделали, как предлагал vadimych - опубликовали текст ошибки, то и подсказку получили бы сразу.

Разумеется, не видит. TASM - это старая [szie=3]DOS[/size]овская программа, она и не должна длинные имена видеть!


p.s. кстати, не знаю, будет ли для Вас сюрпризом, но полученный вами exeшник тоже является приложением под MS DOS, и поэтому возможны проблемы с работоспособностью на современных Windows (Vista/7/8)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.07.2013, 18:41   #8
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

В строке
Код:
	 mov bx, mary_time+bp
желательно скобки поставить.
Код:
	 mov bx, [mary_time+bp]
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мелодия будильника по умолчанию Damik Общие вопросы Delphi 1 10.05.2013 21:16
Сигнал/мелодия через динамик? remont_it, Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 28.12.2012 14:59
Сигнал/мелодия через динамик? remont_it, C++ Builder 4 28.12.2012 14:43
Простая мелодия под Windows... BARS_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 11.11.2011 17:33
мелодия в паскале hasana Паскаль, Turbo Pascal, PascalABC.NET 4 26.05.2010 23:11