Автор работы: Пользователь скрыл имя, 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
Содержание пояснительной записки:
Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы.
Индивидуальное задание: рассчитать с помощью средств Паскаля и Ассемблера выражение (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 для получения целого результата, что соответствует заданию.
Принятие входных данных
Вычисление знаменателя
Вычисление числителя
Вычисление выражения
Обработка результатов для вывода
Данная функция происходит в три этапа:
Текст подпрограммы имеется в приложении.
Процедуры тестировались на разных наборов. При тестировании использовался ПК с процессором 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 раз. Сюда входит и вызов и собственно само вычисление.
Быстродействие ассемблера намного выше, это связано с его более низким аппаратным уровнем.
Текст программы имеется в приложении.
Для более быстрого выполнения поставленной задачи используются ЯВУ, Ассемблер используется либо в исключительных случаях, когда ЯВУ бессилен, либо с умыслом программиста.
.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,
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):
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):
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.