Помощь - Поиск - Пользователи - Календарь
Полная версия: Управление динамиком компьютера
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
HoRRoR
Составить программу для генерации звуковых сигналов, период которых вычисляется по формуле T=(A+1000)/5.
Переменную А ввести с клавиатуры. Размерность А - 16-ти разрядное слово (WORD) (0...65535). Прерывание программы при нажатии клавиши ESC.
мисс_граффити
для начала - посмотри вот эту темку.
Мелодия системного динамика
horror
Я вообще в Ассемблере ламер, просто очень надо написать, для подруги для контрольной работы в Университет.
xds
.model tiny
locals

.code
.startup
;ввод величины A
input_params:
lea dx,msg1
call read_int
jc exit ;ax = A

;ax = (ax + 1000)/5
xor dx,dx
add ax,1000
adc dx,0
mov cx,5
div cx

;запись коэффициента деления в 3-й канал таймера
mov dx,ax
mov al,0B6h
out 43h,al
mov al,dl
out 42h,al
mov al,dh
out 42h,al

;включить динамик
in al,61h
or al,3
out 61h,al

jmp input_params

;завершение работы программы
exit:

;выключить динамик
in al,61h
and al,0FCh
out 61h,al

;выход
mov ax,4C00h
int 21h

;--- Ввод целого числа ---
read_int proc
n = word ptr [bp-2]
push bp
mov bp,sp
sub sp,2
mov n,0
mov ah,9 ;вывод промпта
int 21h
@@read_char:
mov ah,8 ;ввыод символа
int 21h
cmp al,27 ;ESC -> выход с CF = 1
je @@cancel
cmp al,13 ;CR -> завершение ввода
je @@done
cmp al,'0' ;является ли введённый символ цифрой?
jb @@read_char
cmp al,'9'
ja @@read_char
push ax ;эхопечать
mov dx,ax
mov ah,2
int 21h
pop bx
sub bl,'0' ;добавление цифры в результат
xor bh,bh
mov ax,10
mul n
add ax,bx
mov n,ax
jmp @@read_char
;выход с CF = 1
@@cancel:
stc
jmp @@exit
@@done:
;переход на новую строку
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
;выход с результатом в AX и CF = 0
mov ax,n
clc
@@exit:
mov sp,bp
pop bp
ret
read_int endp

.const
msg1 db 'A> $'

end
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.