Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Издать Beep под BIOS


Автор: Hohhi 29.11.2009, 01:15
необходимо издать beep, используя только BIOS прерывание(я). Насколько я знаю 7ка в таблице ASCII соответствует звуковому сигналу. По непонятным мне причинам исполняя след код звука я не слышу.
Код

        mov cx,1
        mov ah,0Ah
        mov al,07h
        int 10h

Подскажите варианты решения задачи

Автор: spin2 29.11.2009, 02:05
Hohhi, когда я учила асм и проигрывала сигналы ("в лесу родилась елочка"), нужно было еще частоту сигнала указывать...

Автор: 111u3 29.11.2009, 19:25
spin2, частоту сигнала ты указывать будешь если тебе ее дадут где указать. Тут же просто издать звук с помощью ascii кода.

Автор: iff 30.11.2009, 15:06
Я попробовал применить эту функцию 0ah прерывания 10h. Тоже ничего не получилось. Более того, у меня не получилось вывести на экран даже обычный символ (букву A).
Я бы предложил использовать функцию 02h прерывания 21h. Ниже дан код программы, которая издаёт один звук.
Код

.model small
.code
main:
mov ah, 02h        ;Издать звук
mov dl, 07h
int 21h

mov ax, 4c00h      ;Выход
int 21h
end main

Автор: 111u3 30.11.2009, 17:04
Гы, ну не знаю люди как вы умудряетесь так кодить. У меня что звуки, что сисмволы как через прерывания дос"а так и бсвв спокойно выводятся хоть под виндой, хоть под чем. Да и при отсутсвии ос тоже все прерывания биоса работают

Автор: iff 30.11.2009, 19:06
Ой, не внимательно прочитал первый пост. А там ведь написано, что нужно писать под BIOS, а это значит, что прерывание 21h использовать нельзя. Тогда можно попробовать это:
Код

mov ax, 0e07h
int 10h

Этот код организует вывод на экран в режиме телетайпа.
Как вы понимаете, этот код надо поставить вместо 4-6 строчек моего предыдущего листинга.

111u3, я делау так: в AsmTool набираю программу и компилирую TASM 4.1 в файл *.EXE
Если набиру код из первого поста (предворительно введя все необходимые директивы, функцию завершения программы, и т.д.), то программа запускается, а звука нет.

Автор: Hohhi 30.11.2009, 20:04
iff, удивительно, но у меня и так не бипит. Может у меня с динамиком лажа конечно. Запустите кто-то у себя такой код:
Код

CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
        org     100h            
begin:  jmp     main            
;-----------------------------------------------------------------
message db 'Hello'
main   proc near
        mov ax, 0e07h
    int 10h
        ret    
        mov ax,4C00h
        int 21h                 
main    endp 
codesg  ends
        end   begin

Автор: iff 30.11.2009, 20:39
Запустил ваш код. Я так понял это программа типа COM. Я её откомпилировал и запустил. Она издала 1 звук и закрылось. Но если ее откомпилировать в EXE, то она работала странно: издавала 3 звука, а потом не завершало работу. Не совсем понял зачем в 10-ой строке инструкция ret. Я убрал эту инструкцию, а затем снова компилировал в EXE. Тогда программа зароботала нормально.

Автор: Hohhi 30.11.2009, 23:15
iff, Спасибо, разобрался, суть уловил

Автор: 111u3 1.12.2009, 09:45
iff, так у тебя звук будет издаватся через эмулятор терминала а при простом выводе символа этого не будет. При простом выводе символа он выведет это символ, а терминал обработает поступивший символ и если он совпадает с одним из кодов то исполнит дейтвие этого кода.

Автор: Mikl_ 1.12.2009, 13:56
Hohhi, 
во вложении (исходник asm и готовый com) проигрывающий цирковой марш через системный динамик и программирование портов, используется 0-ая функция прерывание 1Ah для получения задержки в ~50 мсек  smile не нравится прерывание 1Ah -- поищи как делать задержку через 10h прерывание smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)