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

Автор работы: Пользователь скрыл имя, 04 Апреля 2013 в 20:32, курсовая работа

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

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

Содержание

Введение 3
Анализ задания 3
Разработка подпрограммы ввода целых чисел 3
Разработка подпрограммы вывода целых чисел 4
Запись решения задачи вычисления функции на языке высокого уровня 4
Схема алгоритма вычисления функции для реализации на Ассемблере 5
Запись решения задачи вычисления функции на языке Ассемблер 6
Планирование, проведение и анализ результатов тестирования разработанных на Ассемблере процедур 6
Планирование, проведение и анализ результатов экспериментов по измерению быстродействия процедур, выполняющих вычисление заданной функции 7
Заключение 7
Список использованных источников 7
Приложение А 8
Приложение Б 12

Прикрепленные файлы: 1 файл

Курсач.doc

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

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

 

 

Введение

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

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

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

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

В качестве входных данных используются три переменные a,c,d. Ввод реализован для любых целых чисел. Ввод отрицательных чисел также присутствует, он осуществлен проверкой ввода знака «-». При вводе чисел большой размерности в числителе и несущественном знаменателе может возникнуть переполнение и результат будет неправильным, но это отслежено на уровне ввода, то есть максимальная размерность 4 знака. Аналитически тогда можно представить размерность максимального ответа: (8*4999 + 2*9999 – 2) / (2*4999 – 9997)= 59988 в 10 СС или EA54 в 16 СС, при входных данных a=9997, c=4999, d=9999. При таком вводе так же возникает ошибка подсчета, так как все разряды заняты под само число, то есть старший, отвечающий за знак тоже занят. А значит компилятор «не понимает» знак числа и делает его отрицательным, что обуславливает вывод на экране не 59988, а -5548. Это говорит о том, что для представления результата одного слова (2 байта), то есть одного регистра, не хватает. Ввод 2*c = a считается некорректным и повторяет повтор ввода. Возможность исправления ввода путем нажатия BackSpace отсутствует.

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

 

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

 

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

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

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

 

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

sl:=8*y+2*z-2;

na:=2*y-x;

raschet:=sl div na;

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

 

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

 

 

Принятие входных данных


 

Вычисление знаменателя


 

Вычисление числителя


 

Вычисление выражения


 

Обработка результатов для вывода

 

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

 

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

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

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

 

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

 

Процедуры тестировались  на разных наборов. При тестировании использовался ПК с процессором Intel Core 2 с частотой 2.00 Гц.

 

Входные данные

Ассемблер

Ассемблерная вставка

Паскаль

9  5  14

17 мс

76 мс

98 мс

-9  -6  0

22 мс

71 мс

98 мс

0 99  2

22 мс

77 мс

98 мс

0  -1 8

17 мс

77 мс

98 мс


 

 

 

 

 

 

 

 

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

 

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

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

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

 

Заключение

 

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

 

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

 

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

 

Приложение А

.model tpascal

public input, calc, output

 

.data

r dw 4 dup (?)

znam dw ?

chis dw ?

rez dw ?

an dw ?

cn dw ?

dn dw ?

fm db ?

sm db ?

min db ?

 

.code

 

input  proc near

push bp

mov bp, sp

mov cx, 4

mov bx, 10

sub si,si

sub dx, dx

 

mov ah, 02h 

mov dl, 0Ah 

int 21h 

mov ah, 02h 

mov dl, 0Dh 

int 21h 

 

mov min, 0

 

cikl:  jmp inp

tuda:  cmp min, 1

je inp

cmp cx, 4

jne inp

mov dx, '-'

mov ah, 02h

int 21h

mov min, 1

 

inp:

mov ah, 08h 

int 21h

sub ah, ah

 

cmp ax, 45d

je tuda

 

cmp cx, 4

je na

 

cmp ax, 13d  

je ggo

 

na:

cmp min, 1

jne naa

cmp cx, 4

jne naa

 

cmp ax, 31h

jl inp

 

jmp na9  

 

naa:  cmp ax, 30h

jl inp

na9:  cmp ax, 39h

jg inp

 

sub ax,30h

mov r[si], ax

add si, 2

 

add ax, 30h  

mov dx, ax

mov ah, 02h

int 21h

 

loop cikl

 

ggo:  

mov cx, 1

ggo1:

sub si, 2

mov ax, r[si]

mul cx

add bx, ax

mov ax, 10

mul cx

mov cx, ax

 

cmp si, 0

jg ggo1

 

sub bx,10d

mov ax, bx

cmp min, 1

jne vih

neg ax

 

vih:  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, cn

mov bx, 2

imul bx

mov bx, an

sub ax, bx

mov znam, ax

 

mov ax, cn

mov bx, 8

imul bx

mov cx, ax

mov ax, dn

mov bx, 2

imul bx

add ax, cx

sub ax, 2

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 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: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:=msTime;

end;

 

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

var sl,na:longint;

begin

sl:=8*y+2*z-2;

na:=2*y-x;

raschet:=sl div na;

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, cv

mov bx, 2

imul bx

mov bx, av

sub ax, bx

mov znam, ax

 

mov ax, cv

mov bx, 8

imul bx

mov cx, ax

mov ax, dv

mov bx, 2

imul bx

add ax, cx

sub ax, 2

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

@go:

end;

 

begin

  clrscr;

  write('‚ўҐ¤ЁвҐ жҐ«лҐ зЁб«  a,c,d');

  repeat

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

  if (a=2*c) then begin writeln;

  writeln('Error! Input again:'); end;

  until (a<>2*c);

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

  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;

  writeln(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;

  writeln(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;

  writeln(Time(s1,s2,p1,p2),' ms');

 

  readkey;

end.


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