Автор работы: Пользователь скрыл имя, 18 Октября 2012 в 22:58, курсовая работа
Целями выполнения курсовой работы является исследование возможностей систем программирования; закрепление навыков, полученных в ходе лабораторного практикума; прослеживание взаимосвязей разных уровней представления программы, создание процедуры для вычисления функции по варианту индивидуального задания на языке высокого уровня, а также на языке ассемблер и сравнить обе программы по быстродействию, а также реализовать процедуру целочисленного ввода и вывода на языке ассемблер.
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«ВЛАДИМИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Кафедра «Вычислительная техника»
Курсовая работа
по дисциплине
«Программирование на ЯВУ»
на тему:
«Интеграция 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 для получения целого результата, что соответствует заданию.
Данная функция происходит в три этапа:
Первый этап содержит свои операции согласно формуле, второй – свои, результат получается делением, командой div, только потом его отрицание, если результат таков.
Текст подпрограммы имеется в приложении.
Процедуры тестировались на разных вариациях наборов входных данных и соответствуют корректной и успешной работе. При тестировании использовался ПК с процессором Intel Core 2 Duo с частотой 2.66 Гц. Разработанные на языке ассемблер процедуры работают устойчиво ко всем наборам данных, исключение деления на ноль так же реализовано на уровне ассемблера. Об этом выводится соответствующее сообщение: «Error!». Отсекаются некорректные вводы после нуля, а так же знака минус, то есть «один раз и только в начале».
Планирование, проведение и анализ результатов экспериментов по измерению быстродействия процедур, выполняющих вычисление заданной функции
Как видно из вышеприведенных снимков работы программы, быстродействие идет по убыванию от отдельно созданной ассемблерной процедуры к процедуре, реализованной на паскале. Быстродействие измеряется путем многократного прохождения процедур, 1000000000 раз. Сюда входит и вызов и собственно само вычисление.
Быстродействие ассемблера намного выше, это связано с его более низким аппаратным уровнем и «близости к АО»
Текст программы имеется в
Для более быстрого выполнения поставленной задачи используются ЯВУ, Ассемблер используется либо в исключительных случаях, когда ЯВУ бессилен, либо когда время выполнения критично, либо с умыслом программиста.
.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,
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):
var chislitel,znamenatel:longint;
begin
chislitel:=8*(z*41-y);
znamenatel:=(x-4);
raschet:=chislitel div znamenatel;
end;
function schet(av,cv,dv:integer):
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,':
writeln(h22,':',m22,':',s22,':
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,':
writeln(h22,':',m22,':',s22,':
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,':
writeln(h22,':',m22,':',s22,':
writeln('Performance time by Pascal: ',Time(s1,s2,p1,p2),' ms');
readkey;
end.