Автор: Пользователь скрыл имя, 25 Января 2012 в 12:40, курсовая работа
Целью данного курсового проекта является углубление и закрепление знаний, полученных по дисциплине «Системное программное обеспечение», формирование опыта создания прикладных программ с использованием программного продукта Turbo Assembler, а также изучение системных функций DOS и BIOS и рассмотрение механизма работы их прерываний.
Введение 4
1 Теоретическая часть 5
1.1 Язык Ассемблер 5
1.2 Достоинства языка Ассемблер 6
1.3 Недостатки языка Ассемблер 7
1.4 Стек 8
1.5 Система прерываний 10
1.6 Макрокоманды 14
1.7 Этапы разработки программы 16
2 Практическая часть 18
2.1 Постановка задачи 18
2.2 Назначение программы 18
2.3 Наименование программы 18
2.4 Требования к программному обеспечению 18
2.5 Описание структуры программы 18
3 Структура программы 19
4 Используемые технические средства 21
5 Запуск программы 22
Заключение 23
Список использованной литературы
; timer.asm
; демонстрация
перехвата прерывания
; в левом углу экрана
.model tiny
.code
.186 ; для pusha/popa и сдвигов
org 100h
start proc near
; сохранить адрес
предыдущего обработчика
mov ax,351Ch ; AH = 35h, AL = номер прерывания
int 21h ; функция DOS: определить адрес обработчика
mov word ptr old_int1Ch,bx ; прерывания
mov word ptr old_int1Ch+2,es ; (возвращается в ES:BX)
; установить наш обработчик
mov ax,251Ch ; AH = 25h, AL = номер прерывания
mov dx,offset int1Ch_handler ; DS:DX - адрес обработчика
int 21h ; установить обработчик прерывания 1Ch
; здесь размещается
собственно программа,
mov ah,1
int 21h ; ожидание нажатия на любую клавишу
; конец программы
; восстановить
предыдущий обработчик
mov ax,251Ch ; AH = 25h, AL = номер прерывания
mov dx,word ptr old_int1Ch+2
mov ds,dx
mov dx,word ptr cs:old_int1Ch ; DS:DX - адрес обработчика
int 21h
ret
old_int1Ch dd ? ; здесь хранится адрес предыдущего обработчика
start_position dw 0 ; позиция на экране, в которую выводится текущее время
start endp
; обработчик для прерывания 1Ch
; выводит текущее время в позицию start_position на экране (только в текстовом
; режиме)
int1Ch_handler proc far
pusha ; обработчик аппаратного прерывания
push es ; должен сохранять ВСЕ регистры
push ds
push cs ; на входе в обработчик известно только значение
pop ds ; регистра CS
mov ah,02h ; Функция 02h прерывания 1Ah:
int 1Ah ; чтение времени из RTC
jc exit_handler ; если часы заняты - в другой раз
; AL = час в BCD-формате
call bcd2asc ; преобразовать в ASCII
mov byte ptr output_line[2],ah ; поместить их в
mov byte ptr output_line[4],al ; строку output_line
mov al,cl ; CL = минута в BCD-формате
call bcd2asc
mov byte ptr output_line[10],ah
mov byte ptr output_line[12],al
mov al,dh ; DH = секунда в BCD-формате
call bcd2asc
mov byte ptr output_line[16],ah
mov byte ptr output_line[18],al
mov cx,output_line_l ; число байтов в строке - в CX
push 0B800h
pop es ; адрес в видеопамяти
mov di,word ptr start_position ; в ES:DI
mov si,offset output_line ; адрес строки в DS:SI
cld
rep movsb ; скопировать строку
exit_handler:
pop ds ; восстановить все регистры
pop es
popa
jmp cs:old_int1Ch ; передать управление предыдущему
; обработчику
; процедура bcd2asc
; преобразует
старшую цифру упакованного
; а младшую цифру - в ASCII-символ в AL
bcd2asc proc near
mov ah,al
and al,0Fh ; оставить младшие 4 бита в AL
shr ah,4 ; сдвинуть старшие 4 бита в AH
or ax,3030h ; преобразовать BCD в ASCII-символы
ret
bcd2asc endp
; строка " 00h 00:00" с атрибутом 1Fh (белый на синем) после каждого символа
output_line db ' ',1Fh,'0',1Fh,'0',1Fh,'h',1Fh
db ' ',1Fh,'0',1Fh,'0',1Fh,':',1Fh
db '0',1Fh,'0',
output_line_l equ $-output_line
int1Ch_handler endp
end start