close

Вход

Забыли?

вход по аккаунту

?

lab2

код для вставкиСкачать
МИНОБРНАУКИ РОССИИ
Сарапульский политехнический институт (филиал)
федерального государственного бюджетного образовательного учреждения высшего профессионального образования
"Ижевский государственный технический университет"
им. М.Т. Калашникова
Кафедра конструирования и производства радиоаппаратуры
Отчет по лабораторной работе №2
"Технология разработки программного модуля"
По дисциплине: "Системное программное обеспечение"
специальности 230100 "Информатика и вычислительная техника"
Выполнил студент гр. Б05-781-1
Втюрин М.В.
Проверил к.т.н., доцент
Мишков М.Ю.
2013 г.
1. Цель работы.
Изучить процесс разработки программных модулей на языке ассемблера.
2. Задание на лабораторную работу.
Ознакомиться с теоретическими сведениями. Написать, откомпилировать и исследовать контрольный пример разработки программы. Написать, скомпилировать и отладить программу по заданию преподавателя. Составить отчет о выполненной работе.
3. Ход выполнения работы
3.1 Написать, откомпилировать и исследовать программу, выводящую на дисплей таблицу ASCII-кодов в 16 строках по 16 символов.
Текст программы:
model small
.stack 100h
.code
start:
mov cx,256;счетчик
mov dx,0;индекс, хранящий ASCII код символа
mov bl,16;делитель
m1: mov ax,dx;начало цикла
div bl;содержимое аккумулятора делить на 16
cmp ah,0;остаток равен нулю?
jnz m2;перейти на m2, если не равен
mov ah,02h;подготовка к переводу строки
push dx;временно сохранить индекс в стеке
mov dl,0dh;перевод строки
int 21h;
mov dl,0ah;
int 21h;
pop dx;восстановить индекс
m2: mov ah,06h;подготовка к выводу символа на дисплей
int 21h;вывод
inc dl;;dx++
loop m1;;окончание цикла
mov ah,04ch
int 21h
end start
3.2 Вывести звуковой сигнал из системного динамика.
Для создания мелодии используем таблицу частот нот и сами ноты:
Nokia Tune:
Текст программы:
music_stack SEGMENT PARA STACK 'stack'
db 64 dup('stack')
music_stack ENDS music_data SEGMENT PARA PUBLIC 'data'
; время задержки music_time dw 2 dup (25), 50, 100 dw 2 dup (25), 50, 100 dw 2 dup (25), 50, 100, 150
; цельная нота, это 100 (1 сек), половинная 50, 25 это четверть, и т. д.
; мелодия music_freq dw 659, 587, 370, 415 ; 1 такт
dw 554, 494, 294, 330 ; 2 такт
dw 494, 440, 277, 330, 440, 0FFFFh ; 3-4 такт
; ноты соответствуют частотам (из таблицы выше)
; ми 659,26 ; ре 587,33 ; фа-диез 369,99 ; соль-диез 415,30 ; до-диез 554,37 ; си 493,88 ; ре 293,67 ; ми 329,63 ; си 493,88
; ля 440.0 ; до-диез 277,18 ; ми 329,63 ; ля 440.0 music_data ENDS music_code SEGMENT PARA PUBLIC 'code' music proc far assume CS: music_code, DS: music_data, SS: music_stack
push DS xor ax, ax ; обнуляем ax
push ax ; DS:0000 по нему будем выходить в ОС mov ax, music_data ; явно определим сегмент данных
mov DS, ax
; подготовим все для проигрыша звука, т. е.
lea si, music_freq ; загрузим в si массив мелодии
call play ; запускаем процедуру play
ret music 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, music_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 music_code ENDS END music
end start
4. Вывод о порядке разработки программных модулей на языке ассемблера.
Программа, написанная на ассемблере, может состоять из нескольких частей, называемых модулями, в каждом из которых могут быть определены один или несколько сегментов данных, стека и кода. Любая законченная программа на ассемблере должна включать один главный, или основной (main), модуль, с которого начинается ее выполнение. Основной модуль может содержать программные сегменты, сегменты данных и стека, объявленные при помощи упрощенных директив. Кроме того, перед объявлением сегментов нужно указать модель памяти при помощи директивы .model.
Документ
Категория
Рефераты
Просмотров
25
Размер файла
73 Кб
Теги
lab2
1/--страниц
Пожаловаться на содержимое документа