Интеграция Assembler вTurbo Pascal

Автор работы: Пользователь скрыл имя, 18 Октября 2012 в 22:58, курсовая работа

Краткое описание

Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы, создание процедуры для вычисления функции по варианту индивидуального задания на языке высокого уровня, а также на языке ассемблер и сравнить обе программы по быстродействию, а также реализовать процедуру целочисленного ввода и вывода на языке ассемблер.

Содержимое работы - 1 файл

Отчёт.doc

— 565.00 Кб (Скачать файл)

Федеральное агентство  по образованию 

Государственное образовательное учреждение

высшего профессионального  образования

«ВЛАДИМИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Кафедра «Вычислительная  техника»

 

 

 

 

Курсовая работа

по дисциплине

«Программирование на ЯВУ»

на тему:

«Интеграция Assembler вTurbo Pascal»

 

 

 

 

Выполнил:

ст. гр. ВТ

 

Принял:

преподаватель

М.А.

 

 

 

 

 

 

Вл 2010

 

Содержание пояснительной записки:

 

 

Введение

 

Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление  навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы, создание процедуры для вычисления функции по варианту индивидуального задания на языке высокого уровня, а также на языке ассемблер и сравнить обе программы по быстродействию, а также реализовать процедуру целочисленного ввода и вывода на языке ассемблер.

Анализ задания

 

Индивидуальное задание: рассчитать с помощью средств  Паскаля и Ассемблера выражение (-2*c + d*82) / (a/4 – 1). Необходимо исключить ввод 4 для а, что реализовано в программе. Само выражение было преобразовано в равноценное: 8*(d*41-с) / (a – 4). Предусмотрено переполнение памяти, о чем говорит корректность выполнения на большинстве наборов входных данных.

Разработка подпрограммы ввода целых чисел

 

В качество входных данных используются три переменные a,c,d. Ввод реализован для четырёхзначных целых чисел. Фильтрация ввода осуществлена. Ввод минуса прослежена программистом и реализует считывание и преобразование числа в его дополнительный код (так хранятся отрицательные числа), отображение происходит с помощью отдельного вывода через код по таблице ASCII. Возможность исправления ввода путем нажатия BackSpace отсутствует, есть об этом соответствующее сообщение. Подпрограмма корректно работает.

Текст подпрограммы имеется в приложении.

 

Разработка подпрограммы вывода целых чисел

 

В качестве выходных данных является результат вычислений исходного  выражения. Вывод реализован для  всех чисел возможного вычисляемого диапазона, который предоставляем  от набора входных данных. Минус реализован как и на вводе.

Текст подпрограммы имеется  в приложении.

Запись решения задачи вычисления функции на языке высокого уровня

 

Выражение (-2*c + d*82) / (a/4 – 1) на языке Паскаль было записано:

<Результирующая переменная>:=8*(-c + d*41) / (a – 4);

Все арифметические операции имеются в ЯВУ. Для данных вычислений использовалась отдельная процедура, вместо обычного деления команда div для получения целого результата, что соответствует заданию.

 

Схема алгоритма вычисления функции для реализации на Ассемблере

 


 
Запись решения задачи вычисления функции на языке Ассемблер

 

Данная функция происходит в три этапа:

    1. Вычисление числителя;
    2. Вычисление знаменателя;
    3. Вычисление результата.

Первый этап содержит свои операции согласно формуле, второй – свои, результат получается делением, командой div, только потом его отрицание, если результат таков.

Текст подпрограммы имеется  в приложении.

 

Планирование, проведение и анализ результатов тестирования разработанных на Ассемблере процедур

 

Процедуры тестировались на разных вариациях наборов входных данных и соответствуют корректной и успешной работе. При тестировании использовался ПК с процессором Intel Core 2 Duo с частотой 2.66 Гц. Разработанные на языке ассемблер процедуры работают устойчиво ко всем наборам данных, исключение деления на ноль так же реализовано на уровне ассемблера. Об этом выводится соответствующее сообщение: «Error!». Отсекаются некорректные вводы после нуля, а так же знака минус, то есть «один раз и только в начале».

 

 

 

 

 

 

 

Планирование, проведение и анализ результатов экспериментов по измерению быстродействия процедур, выполняющих вычисление заданной функции

 

Как видно из вышеприведенных  снимков работы программы, быстродействие идет по убыванию от отдельно созданной ассемблерной процедуры к процедуре, реализованной на паскале. Быстродействие измеряется путем многократного прохождения процедур, 1000000000 раз. Сюда входит и вызов и собственно само вычисление.

Быстродействие ассемблера намного  выше, это связано с его более низким аппаратным уровнем и «близости к АО»

Текст программы имеется в приложении.

 

Заключение

 

Для более быстрого выполнения поставленной задачи используются ЯВУ, Ассемблер используется либо в исключительных случаях, когда ЯВУ бессилен, либо когда время выполнения критично, либо с умыслом программиста.

 

Список использованных источников

 

  1. Голубь Н.Г Искусство программирования на ассемблере
  2. В. И. Юров ASSEMBLER Практикум
  3. В. И. Юров ASSEMBLER УЧЕБНИК ДЛЯ ВУЗОВ
  4. Пирогов В.Ю. ASSEMBLER. Учебный курс.
  5. Интернет (форумы программистов)

 

Приложение А

.model tpascal

public input, calc, output

 

.data

r dw 4 dup (?)

ifa dw ?

znam dw ?

chis dw ?

rez dw ?

an dw ?

cn dw ?

dn dw ?

dm dw ?

fm db ?

sm db ?

mo db ?

 

.code

;###################ВВОД###################

input  proc near

push bp

mov bp, sp

 

mov ax, bp[4]

mov ifa, ax

 

nach:  mov ah, 02h

mov dl, 0Ah

int 21h

mov ah, 02h

mov dl, 0Dh

int 21h

 

mov mo, 0

mov cx, 4

mov si, 0

inn:

jmp go_input

da:  cmp cx, 4

jne otob

cmp ax, 30h

jne otob

input_again: cmp mo, 1

je go_input

mov dx, '-'

mov ah, 02h

int 21h

mov mo, 1

go_input: mov ah, 08h

int 21h

 

cmp cx, 4

je first

mov ah, 0h

  cmp ax, 13d

je entr

first:

cmp cx, 4

jne pa

mov ah, 0h

cmp ax, 45d

je input_again

pa:  cmp ax, 30h

jl go_input

cmp ax, 39h

jg go_input

cmp mo, 1

je da

 

otob:  mov dx, ax

mov ah, 02h

int 21h

 

sub ax, 30h

mov ah, 0

 

mov r[si], ax

add si, 2

 

loop inn

entr:

mov cx, 1

mov bx, 0

ob:  sub si, 2

mov ax, r[si]

mul cx

add bx, ax

mov ax, 10

mul cx

mov cx, ax

 

cmp si, 0

jg ob

 

mov ax, bx

 

cmp ax, 4

jne exit1

cmp ifa, 1

jne exit1

 

mov dx, 'E'

mov ah, 02h

int 21h

mov dx, 'r'

mov ah, 02h

int 21h

mov dx, 'r'

mov ah, 02h

int 21h

mov dx, 'o'

mov ah, 02h

int 21h

mov dx, 'r'

mov ah, 02h

int 21h

mov dx, '!'

mov ah, 02h

int 21h

 

jmp nach

exit1:  cmp mo, 1

jne exit2

neg ax

 

exit2:  pop bp

ret

input endp

 

;###################ВЫЧИСЛЕНИЯ#############

calc  proc near

push bp

mov bp, sp

 

mov fm, 0

mov sm, 0

 

mov ax, bp[8]

mov an, ax

mov ax, bp[6]

mov cn, ax

mov ax, bp[4]

mov dn, ax

 

mov ax, an

sub ax, 4

mov znam, ax

 

mov ax, dn

mov dm, 29h

imul dm

sub ax, cn

mov dm, 8h

imul dm

mov chis, ax

 

cmp ax, 0

jg pol1

mov fm, 1

neg ax

mov chis, ax

pol1:  mov ax, znam

cmp ax, 0

jg pol2

mov sm, 1

neg ax

mov znam, ax

pol2:

 

mov ax, chis

sub dx, dx

mov bx, znam

div bx

 

mov bl, fm

cmp bl, sm

je go_end

neg dx

neg ax

 

go_end:  pop bp

ret

calc endp

 

;###################ВЫВОД##################

output  proc near

push bp

mov bp, sp

 

mov ax, bp[4]

mov rez, ax

cmp ax, 0

jge no_min

mov dx, '-'

mov ah, 02h

int 21h

neg rez

no_min:

mov ax, rez

mov bx, 10

sub  si, si

jmp  go

again:

sub dx, dx

div bx

mov r[si], dx

add si, 2

go:  

cmp ax, bx

jnl again

mov r[si], ax

add si,2  

viv:

sub si, 2

add r[si],30h

mov dx, r[si]

mov ah, 02h

int 21h

cmp si, 0

jne viv

 

pop bp

ret

output endp

 

end. 
Приложение Б

 

program main;

 

uses dos,crt;

 

{$L ASM.OBJ}

 

function calc(const a,c,d:integer):longint; external;

function input(x:integer):integer; external;

procedure output(res:integer); external;

 

var a,c,d:integer; i,resA,resP:longint;

h1,h2,m1,m2,s1,s2,p1,p2:word;

h11,h22,m11,m22,s11,s22,p11,p22:string;

 

function Time(s,ss,p,pp:word):string;

var sTime,pTime,msTime:string;

begin

if ss<s then ss:=ss+60;

if pp<p then begin pp:=pp+100; ss:=ss-1; end;

s:=ss-s; str(s,sTime);

p:=pp-p; str(p,pTime);

p:=s*60+p; str(p,msTime);

Time:=sTime+'s and '+pTime+'ms or '+msTime;

end;

 

function raschet(x,y,z:integer):longint;

var chislitel,znamenatel:longint;

begin

chislitel:=8*(z*41-y);

znamenatel:=(x-4);

raschet:=chislitel div znamenatel;

end;

 

function schet(av,cv,dv:integer):longint; assembler;

var fmin,smin:byte; chis,znam:integer;

asm

mov  fmin, 0

mov  smin, 0

 

mov  ax, av

sub  ax, 4

mov  znam, ax

 

mov  ax, dv

mov  bx, 29h

imul bx

sub  ax, cv

mov  bx, 8

imul bx

mov  chis, ax

 

cmp  ax, 0

jg   @pol1

mov  fmin, 1

neg  ax

mov  chis, ax

@pol1:

mov  ax, znam

cmp  ax, 0

jg   @pol2

mov  smin, 1

neg  ax

mov  znam, ax

@pol2:

 

mov  ax, chis

sub  dx, dx

mov  bx, znam

div  bx

 

mov  bl, fmin

cmp  bl, smin

je   @go

neg  ax

neg  dx

@go:

end;

 

begin

  clrscr;

  write('Введите a,c,d без ошибок!');

  a:=input(1);

  c:=input(0);

  d:=input(0); {writeln(a,c,d);}

{-------------------------------------------------}

  GetTime(h1,m1,s1,p1);

  for i:=1 to 10000000 do resA:=calc(a,c,d);

  GetTime(h2,m2,s2,p2); writeln; {writeln(resA);}

  output(resA); writeln; writeln;

 

  str(h1,h11); str(m1,m11); str(s1,s11); str(p1,p11);

  str(h2,h22); str(m2,m22); str(s2,s22); str(p2,p22);

  writeln(h11,':',m11,':',s11,':',p11);

  writeln(h22,':',m22,':',s22,':',p22);

  writeln('Performance time by Assembler: ',Time(s1,s2,p1,p2),' ms');

{-------------------------------------------------}

  GetTime(h1,m1,s1,p1); resA:=0;

  for i:=1 to 10000000 do resA:=schet(a,c,d);

  GetTime(h2,m2,s2,p2); {writeln(resA);}

  writeln; output(resA); writeln; writeln;

 

  str(h1,h11); str(m1,m11); str(s1,s11); str(p1,p11);

  str(h2,h22); str(m2,m22); str(s2,s22); str(p2,p22);

  writeln(h11,':',m11,':',s11,':',p11);

  writeln(h22,':',m22,':',s22,':',p22);

  writeln('Performance time by Assembler''s Insert: ',Time(s1,s2,p1,p2),' ms');

  writeln;

{-------------------------------------------------}

  GetTime(h1,m1,s1,p1);

  for i:=1 to 10000000 do resP:=raschet(a,c,d);

  GetTime(h2,m2,s2,p2);

  writeln(resP); writeln;

 

  str(h1,h11); str(m1,m11); str(s1,s11); str(p1,p11);

  str(h2,h22); str(m2,m22); str(s2,s22); str(p2,p22);

  writeln(h11,':',m11,':',s11,':',p11);

  writeln(h22,':',m22,':',s22,':',p22);

  writeln('Performance time by Pascal: ',Time(s1,s2,p1,p2),' ms');

 

  readkey;

end.


Информация о работе Интеграция Assembler вTurbo Pascal