Разработка программы на Ассемблере

Автор работы: Пользователь скрыл имя, 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

Работа состоит из  3 файла

Основная часть.doc

— 369.00 Кб (Скачать документ)

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

                        ;для удобства вычислений (см. таб. 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        ;сравниваем значение в регистре 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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение С. Пример выполнения программы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




Содержание.doc

— 28.00 Кб (Открыть документ, Скачать документ)

Титульник.doc

— 25.00 Кб (Открыть документ, Скачать документ)

Информация о работе Разработка программы на Ассемблере