Автор работы: Пользователь скрыл имя, 17 Ноября 2012 в 14:19, курсовая работа
Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы.
Содержание пояснительной записки:
Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы.
Индивидуальное задание: рассчитать с помощью средств Паскаля и Ассемблера выражение (25/c – d + 2) / (b + a*a – 1). Во избежание ошибок деления, операции деления были сведены к минимуму, то есть осталось одно главное деление. Выражение приведено к виду (25 – d*с + 2*с) / (b*с + a*a*с – с).
В качестве входных данных используются три переменные a,b,c,d. Ввод реализован для любых целых чисел. Ввод отрицательных чисел также присутствует, он осуществлен проверкой ввода знака «-». Максимальная размерность ввода 4 знака. Ввод (c=b*c+a*a*c) считается некорректным и повторяет ввод.
Текст подпрограммы имеется в приложении.
В качестве выходных данных является результат вычислений исходного выражения. Вывод реализован для всех чисел возможного вычисляемого диапазона, который предоставляем от набора входных данных. Минус реализован как и на вводе.
Текст подпрограммы имеется в приложении.
Выражение (25/c – d + 2) / (b + a*a – 1) на языке Паскаль было записано:
sl:=25-z*u+2*z;
pr:=y*z+x*x*z-z;
raschet:=sl div pr;
Все арифметические операции имеются в ЯВУ. Для данных вычислений использовалась отдельная процедура, вместо обычного деления команда div для получения целого результата, что соответствует заданию.
Данная функция происходит в три этапа:
Текст подпрограммы имеется в приложении.
Процедуры тестировались на разных наборов. При тестировании использовался ПК с процессором Intel Core 2 с частотой 2.00 Гц. В большинстве случаев знаменатель больше числителя, поэтому ответ 0.
Входные данные a,b,c,d |
Ассемблер |
Ассемблерная вставка |
Паскаль |
1,1,1,1 |
16 мс |
55 мс |
64 мс |
1,2,3,4 |
11 мс |
60 мс |
65 мс |
-90,100,2,5 |
16 мс |
50 мс |
64 мс |
4,5,6,7 |
17 мс |
55 мс |
70 мс |
Планирование, проведение и анализ результатов экспериментов по измерению быстродействия процедур, выполняющих вычисление заданной функции
Как видно из таблицы, быстродействие процедуры, реализованной на паскале намного меньше, чем у ассемблерной. Быстродействие измеряется путем многократного прохождения процедур, 1000000000 раз. Сюда входит и вызов и собственно само вычисление.
Быстродействие ассемблера намного выше, это связано с его более низким аппаратным уровнем.
Для более быстрого выполнения поставленной задачи используются ЯВУ, Ассемблер используется либо в исключительных случаях, когда ЯВУ бессилен, либо с умыслом программиста.
.model tpascal
public input, calc, output
.data
r dw 4 dup (?)
znam dw ?
chis dw ?
rez dw ?
an dw ?
bn 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[10]
mov an, ax
mov ax, bp[8]
mov bn, ax
mov ax, bp[6]
mov cn, ax
mov ax, bp[4]
mov dn, ax
mov ax, cn
mov bx, bn
imul bx
mov cx, ax
mov ax, an
imul ax
mov bx, cn
imul bx
add ax, cx
sub ax, cn
mov znam, ax
mov ax, cn
mov bx, dn
imul bx
mov bx, 25
sub bx, ax
mov ax, cn
mov cx, 2
imul cx
add ax, bx
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,b,c,d:integer):longint; external;
function input:integer; external;
procedure output(res:integer); external;
var a,c,b,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,u:integer):
var sl,pr:longint;
begin
sl:=25-z*u+2*z;
pr:=y*z+x*x*z-z;
raschet:=sl div pr;
end;
function schet(av,bv,cv,dv:integer):
var fmin,smin:byte; chis,znam:integer;
asm
mov fmin, 0
mov smin, 0
mov ax, cv
mov bx, bv
imul bx
mov cx, ax
mov ax, av
imul ax
mov bx, cv
imul bx
add ax, cx
sub ax, cv
mov znam, ax
mov ax, cv
mov bx, dv
imul bx
mov bx, 25
sub bx, ax
mov ax, cv
mov cx, 2
imul cx
add ax, bx
mov chis, ax
mov ax, chis
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,b,c,d');
repeat
a:=input; b:=input; c:=input; d:=input; {writeln('_',a,'_',b,'_',c,'_'
if (c=b*c+a*a*c) then begin writeln;
writeln('Error! Input again:'); end;
until (c<>b*c+a*a*c);
{-----------------------------
GetTime(h1,m1,s1,p1);
for i:=1 to 10000000 do resA:=calc(a,b,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,b,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,b,c,d);
GetTime(h2,m2,s2,p2);
writeln(resP); writeln;
writeln(Time(s1,s2,p1,p2),' ms');
readkey;
end.