Автор работы: Пользователь скрыл имя, 18 Ноября 2012 в 08:44, курсовая работа
Распространение процессоров выявило необходимость изучения языка Ассемблер для написания программ для персональных ЭВМ из-за двух причин. Во-первых, программы, написанные на языке Ассемблер, требуют значительно меньшего объема памяти и ресурсов компьютера. Во-вторых, знание языка Ассемблер и машинного кода дает понимание архитектуры машины. А знание архитектуры машины и принципов ее работы дает возможность усовершенствовать написанные программы и повысить их быстродействие за счет применения некоторых специальных методов программирования.
1 Введение……………………………………………………………………..4
2 Постановка задачи……………………………………………………….….6
3 Метод решения задачи……………………………………………………...8
4 Разработка состава исходных, промежуточных и
выходных данных………………………………………………………………9
5 Разработка алгоритма решения задачи…………………………………..10
6 Описание программы…………………………………………………......11
7 Отладка программы……………………………………………………….12
8 Описание языка программирования……………………………………..13
9 Руководство системного программиста…………………………………16
10 Руководство оператора…………………………………………………...21
11 Заключение………………………………………………………………..22
12 Список литературы……………………………………………………….23
Приложение А
Схема данных………………………………………………………………..26
Приложение Б
Схема программы……………………………………………………………27
Приложение В
Текст программы…………………………………………………………….29
Приложение С
Пример выполнения………………………………………………………....36
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Bk,ax ;записываем переведённое значение
;Ввод значения C
mov dx,0800h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t9 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,C ;записываем в регистр
int 21h ;прерывание DOS
mov bl,C+1 ;в bl записываем значение C со смещением на 1
lea si,C+1 ;в si записываем значение C со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;обнуляем регистр
mov ax,cods ;пишем в ax введённое значение
mov Ck,ax ;записываем переведённое значение
;Ввод значения Y
mov dx,0900h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t10 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,y ;записываем в регистр
int 21h ;прерывание DOS
mov bl,y+1 ;в bl записываем значение Y со смещением на 1
lea si,y+1 ;в si записываем значение Y со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Yk,ax ;записываем переведённое значение
;Ввод значения X1
mov dx,0A00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t11 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,x1 ;записываем в регистр
int 21h ;прерывание DOS
mov bl,x1+1 ;в bl записываем значение X1 со смещением на 1
lea si,x1+1 ;в si записываем значение X1 со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov X1k,ax ;записываем переведённое значение
;Ввод значения Xn
mov dx,0B00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t12 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,xn ;записываем в регистр
int 21h ;прерывание DOS
mov bl,xn+1 ;в bl записываем значение Xn со смещением на 1
lea si,xn+1 ;в si записываем значение Xn со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Xnk,ax ;записываем переведённое значение
;Ввод значения h
mov dx,0C00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t13 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,h ;записываем в регистр
int 21h ;прерывание DOS
mov bl,h+1 ;в bl записываем значение h со смещением на 1
lea si,h+1 ;в si записываем значение h со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov hk,ax ;записываем переведённое значение
mov cur,0D00h ;сохранение
в переменной координаты
;Вычисление функции
mov ax,X1k ;пишем в ax значение X1k
mov Xni,ax ;устанавливаем в xni значение X1
mov ax,Xni ;пишем в ax значение Xcod
cmp ax,Yk ;пишем в ax значение Yk
je er ;переход по метке er если X=Y
jg Bbol ;переход по метке Bbol если X>Y
er: ;метка
call error
;вызов процедуры обработки оши
Bbol: ;metka
dal: ;метка
mov ax,Xni
mul xni;X^2
mov rez1,ax
mov ax,Yk
mul ax
mov rez2,ax
mov ax,rez1
mov bx,rez2
add ax,bx
mov bx,ax
mov ax,Ak
mul bx
mov rez3,ax
mov ax,rez1
mov bx,rez2
sub ax,bx
mov bx,Bk
mul bx
mov cx,ax
mov ax,rez3
cwd
div cx
mov rez3,ax
mov ax,Xni
mov bx,Yk
sub ax,bx
mov bx,ax
mov ax,Ck
cwd ;преобразование байта в слово dx:ax
div bx
mov bx,ax
mov ax,rez3
sub ax,bx
mov rezf,ax ;сохраняем результат
mov ax,cur ;в ax заносим координаты курсора
add ax,0100h ;смещение координаты на строку вниз
mov cur,ax ;сохраняем новые координаты
call zf ;процедура для вывода значения f(x)
mov ax,xni ;пишем обновлённый х
cmp ax,Xnk ;ставниваем с последним значением итервала
jg exit ;если x > xn то exit
jmp dal ;иначе продолжаем считать
exit: ;метка
mov ah,0ah ;считываем ввод
lea dx,pause ;записываем в регистр
int 21h
mov ah,4ch ;переносим в регистр AH 4ch (код для выхода)
int 21h ;прерывание DOS
;-----------------------------
t0 DB '','$'
t1 DB '','$'
t2 DB '','$'
t3 DB ' A*(X^2+Y^2) C','$'
t4 DB 'F(x)= --------------- - ---','$'
t5 DB ' B*(X^2-Y^2) X+Y','$'
t6 DB 'Ввод данных:','$'
t7 DB 'Введите A : ','$' ;подсказка о том что следует ввести значение A
t8 DB 'Введите B : ','$' ;подсказка о том что следует ввести значение B
t9 DB 'Введите C : ','$' ;подсказка о том что следует ввести значение B
t10 DB 'Введите y : ','$' ;подсказка о том что следует ввести значение Y
t11 DB 'Введите X1 : ','$' ;подсказка о том что следует ввести значение x1
t12 DB 'Введите Xn : ','$' ;подсказка о том что следует ввести значение xn
t13 DB 'Введите шаг H : ','$' ;подсказка о том что следует ввести значение H
t14 DB 'Значение функции Y= ','$'
t15 DB 'Ошибка - B-Y=0 невозможно выполнить деление','$'
t16 DB 'Значение функции Y= ','$'
pause DB 1 dup (" "),'$' ;для паузы
A DB 1 dup (" "),'$'
B DB 1 dup (" "),'$'
C DB 1 dup (" "),'$'
Y DB 1 dup (" "),'$'
X1 DB 1 dup (" "),'$'
Xn DB 1 dup (" "),'$'
h DB 1 dup (" "),'$'
ascii DW 4 dup (?),'$' ;память для ASCII-кодов
Ak DW ? ;переменные для перевода введёного значения с клавиатуры
Bk DW ? ;в соответствующий ей по номеру порядковый символ ASCII
Ck DW ?
Yk DW ? ;для удобства вычислений
X1k DW ?
Xnk DW ?
hk DW ?
xni DW ? ;изменяющееся значение х
cur DW ? ;координаты для курсора
cuy DW ? ;координаты курсора для вывода F(x)
rez1 DW ? ;промежуточный результат
rez2 DW ? ;промежуточный результат
rez3 DW ? ;промежуточный результат
rez4 DW ? ;промежуточный результат
rezf DW ? ;результат функции
cods DW ?
mn DW 1
start endp
;-----------------------------
;Процедуры
;-----------------------------
clear proc ;процедура очистки экрана
mov AH,6h ;переносим в регистр AH 06h
mov BH,07h ;переносим в регистр BH 07h
mov CX,0000h ;переносим в регистр CX 0000h
mov DX,184fh ;переносим в регистр DX 184fh
int 10h ;прерывание BIOS
ret ;выход из процедуры
clear endp
;-----------------------------
cursor proc ;процедура установки курсора
mov AH,2h ;переносим в регистр AH 2h
mov BH,0 ;переносим в регистр BH 0
int 10h ;прерывание BIOS
ret ;выход из процедуры
cursor endp
;-----------------------------
oput proc ;процедура вывода
mov AH,09h ;переносим в регистр AH 09h
int 21h ;прерывание DOS
ret ;выход из процедуры
oput endp
;-----------------------------
inp proc ;процедура ввода
mov AH,0ah ;переносим в регистр AH 0ah
int 21h ;прерывание DOS
ret ;выход из процедуры
inp endp
;-----------------------------
error proc ;ошибка при делении на 0
mov dx,0D00h ;указываем координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t15 ;указыкаем ссылку на сообшение
call oput ;вызываем поцедуру вывода
mov ah,0ah ;считываем ввод
lea dx,pause ;записываем в регистр
int 21h
jmp exit
ret
error endp
;-----------------------------
zf proc
mov dx,cur ;устанавливаем координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t14 ;указыкаем ссылку на сообшение
call oput ;вызываем поцедуру вывода
mov ax,rezf ;записываем в ax результат функции
call decod ;вызов процедуры обратного перевода
mov ax,cur ;записываем в ах координаты курсора
add ax,0015h ;смещаем в право на 15
mov cuy,ax ;сохраняем новое значение курсора для вывода значения функции
mov dx,cuy ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,ascii ;заносим в dx адрес значения функции
call oput ;вызываем поцедуру вывода
mov cuy,0 ;обнуляем значение курсора для вывода значения функции
mov ax,xni ;значение x
add ax,hk ;x+h
mov xni,ax ;сохраняем новое значение x
ret
zf endp
;-----------------------------
cod proc
;процедура перевода
;в соответствующий ей по
;для удобства вычислений (см. таб. ASCII)
xor ax,ax ;обнуление регистра AX
mov cods,ax ;чистим переменную decods
mov cx,10 ;заносим в регистр CX значение 10
cd: mov al,[si+bx] ;выбор ASCII - символа
and AX,000fh ;удаление 3 (AL&0Fh)
mul mn ;умножение
на множитель для
add cods,ax ;добавление к полученому результату
mov ax,mn ;вычисление следующего значения множителя
mul cx ;умножение AX на CX
mov mn,ax ;запись в переменную mn значения AX
dec bx ;если не последняя цифра, то - продолжать
jnz cd ;переход по метке cd если не ноль
xor ax,ax ;обнуление регистра AX
mov ax,mn ;записываем в регистр множитель
mov mn,1 ;записываем 1 в переменную mn
ret ;выход из процедуры
cod endp ;результат после выхода из процедуры в cods
;-----------------------------
decod proc
;процедура перевода
;символах кода ASCII,
;в форму приемлимую для вывода (в виде чисел)
mov ascii,0 ;записываем 0 в переменную asc
mov cx,10 ;заносим в регистр CX значение 10
lea si,ascii+4 ;заносим в регистр
si значение asc смещенное на 4
dcd2: cmp ax,10
;сравниваем значение в регистр
jb dcd1 ;если в АХ число меньше 10, то - выход
xor dx,dx ;обнуление
div cx ;деление содержимого AX на 10; остаток - в DL
or dl,30h ;формирование кода ASCII очередной цифры
mov [si],dl ;сохранение ASCII - символа
dec si ;декремент si-1
jmp dcd2 ;переход на dcd2
dcd1: or al,30h ;формирование кода ASCII последней (старшей) цифры
mov [si],al ;сохранение ASCII - символа
ret ;выход из процедуры
decod endp
;-----------------------------
CODE ENDS
END begin
Приложение С. Пример выполнения программы.