- •2007 Г.
- •1. Формулировка задания
- •2. Разработка вычислительного алгоритма
- •3. Реализация вычислительного алгоритма
- •3.1 Язык Паскаль
- •Преобразованная программа:
- •3.2 Язык c
- •Преобразованная программа:
- •3.3 Язык Assembler
- •Преобразованная программа:
- •4. Расчёт метрических характеристик
- •4.1 Язык Паскаль
- •4.2 Язык c
- •4.3 Язык Assembler
- •4. Выводы
3.2 Язык c
Для оценки качества программы, исключим комментарии и операторы ввода / вывода.
Кроме того, исключим неиспользуемые переменные. Модифицируем программу и закончим то, что не было закончено в начальной версии программы. Операторы ввода заменим константами и генерацией случайных чисел. На данном этапе другие улучшения программы производиться не будут.
Преобразованная программа:
#include <iostream.h>
#include <stdlib.h>
const int n = 8;
typedef float ary[n];
ary x, y, y_calc;
int i;
float a, b;
void linfit1(const ary x, const ary y)
{
int i;
float sum_x = 0, sum_y = 0, sum_xy = 0,
sum_x2 = 0, sum_y2 = 0;
float xi, yi, sxy, sxx, syy;
for(i = 0; i < n; ++i)
{
xi = x[i];
yi = y[i];
sum_x += xi;
sum_y += yi;
sum_xy += xi*yi;
sum_x2 += xi*xi;
sum_y2 += yi*yi;
}
sxx = sum_x2 - sum_x*sum_x/n;
sxy = sum_xy - sum_x*sum_y/n;
syy = sum_y2 - sum_y*sum_y/n;
b = sxy/sxx;
a = ((sum_x2*sum_y - sum_x*sum_xy)/n)/sxx;
for(i = 0; i < n; ++i)
y_calc[i] = a + b*x[i];
};
void main()
{
randomize();
for(i = 0; i < n; ++i)
{
x[i] = (float)random(2000)/100;
y[i] = (float)random(2000)/100;
}
linfit1(x, y);
cout << "\nx: ";
for(i = 0; i < n; ++i)
cout << x[i] << " ; ";
cout << "\ny: ";
for(i = 0; i < n; ++i)
cout << y[i] << " ; ";
cout << "\ny_calc: ";
for(i = 0; i < n; ++i)
cout << y_calc[i] << " ; ";
};
3.3 Язык Assembler
Программу на языке Assembler сгенерируем из C-кода автоматически.
Преобразованная программа:
.386p
C1_TEXT segment byte public use16 'CODE'
C1_TEXT ends
DGROUP group _DATA,_BSS
assume cs:C1_TEXT,ds:DGROUP
_DATA segment word public use16 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public use16 'BSS'
b@ label byte
b@w label word
_x label dword
db 32 dup (?)
_y label dword
db 32 dup (?)
_y_calc label dword
db 32 dup (?)
_i label word
db 2 dup (?)
_a label dword
db 4 dup (?)
_b label dword
db 4 dup (?)
_BSS ends
C1_TEXT segment byte public use16 'CODE'
assume cs:C1_TEXT
@linfit1$qxnxfxt1 proc far
push bp
mov bp,sp
sub sp,36
push si
push di
cmp word ptr __stklen,sp
ja short @1@86
call far ptr F_OVERFLOW@
@1@86:
mov dword ptr [bp-4],large 0
mov dword ptr [bp-8],large 0
mov dword ptr [bp-12],large 0
mov dword ptr [bp-16],large 0
mov dword ptr [bp-20],large 0
xor dx,dx
mov si,word ptr [bp+6]
mov di,word ptr [bp+10]
@1@142:
mov es,word ptr [bp+8]
fld dword ptr es:[si]
fstp dword ptr [bp-24]
mov es,word ptr [bp+12]
fld dword ptr es:[di]
fstp dword ptr [bp-28]
fld dword ptr [bp-24]
fadd dword ptr [bp-4]
fstp dword ptr [bp-4]
fld dword ptr [bp-28]
fadd dword ptr [bp-8]
fstp dword ptr [bp-8]
fld dword ptr [bp-24]
fmul dword ptr [bp-28]
fadd dword ptr [bp-12]
fstp dword ptr [bp-12]
fld dword ptr [bp-24]
fmul dword ptr [bp-24]
fadd dword ptr [bp-16]
fstp dword ptr [bp-16]
fld dword ptr [bp-28]
fmul dword ptr [bp-28]
fadd dword ptr [bp-20]
fstp dword ptr [bp-20]
fwait
add si,4
add di,4
inc dx
cmp dx,8
jl short @1@142
fld dword ptr [bp-4]
fmul dword ptr [bp-4]
fdiv dword ptr DGROUP:s@
fsubr dword ptr [bp-16]
fstp dword ptr [bp-36]
fld dword ptr [bp-4]
fmul dword ptr [bp-8]
fdiv dword ptr DGROUP:s@
fsubr dword ptr [bp-12]
fstp dword ptr [bp-32]
fld dword ptr [bp-32]
fdiv dword ptr [bp-36]
fstp dword ptr DGROUP:_b
fld dword ptr [bp-16]
fmul dword ptr [bp-8]
fld dword ptr [bp-4]
fmul dword ptr [bp-12]
fsub
fdiv dword ptr DGROUP:s@
fdiv dword ptr [bp-36]
fstp dword ptr DGROUP:_a
fwait
mov di,word ptr [bp+6]
mov si,offset DGROUP:_y_calc
@1@338:
mov es,word ptr [bp+8]
fld dword ptr es:[di]
fmul dword ptr DGROUP:_b
fadd dword ptr DGROUP:_a
fstp dword ptr [si]
fwait
add di,4
add si,4
cmp si,offset DGROUP:_y_calc+32
jne short @1@338
pop di
pop si
leave
ret
@linfit1$qxnxfxt1 endp
assume cs:C1_TEXT
_main proc far
push bp
mov bp,sp
sub sp,2
cmp word ptr __stklen,sp
ja short @2@86
call far ptr F_OVERFLOW@
@2@86:
call far ptr @@randomize$qv
mov word ptr DGROUP:_i,0
@2@114:
push 2000
call far ptr @@random$qi
add sp,2
mov word ptr [bp-2],ax
fild word ptr [bp-2]
fdiv dword ptr DGROUP:s@+4
mov bx,word ptr DGROUP:_i
shl bx,2
fstp dword ptr DGROUP:_x[bx]
push 2000
fwait
call far ptr @@random$qi
add sp,2
mov word ptr [bp-2],ax
fild word ptr [bp-2]
fdiv dword ptr DGROUP:s@+4
mov bx,word ptr DGROUP:_i
shl bx,2
fstp dword ptr DGROUP:_y[bx]
fwait
inc word ptr DGROUP:_i
cmp word ptr DGROUP:_i,8
jl short @2@114
push ds
push offset DGROUP:_y
push ds
push offset DGROUP:_x
push cs
call near ptr @linfit1$qxnxfxt1
add sp,8
leave
ret
_main endp
C1_TEXT ends
C1_TEXT segment byte public use16 'CODE'
@randomize$qv segment virtual
assume cs:@randomize$qv
@@randomize$qv proc far
cmp word ptr __stklen,sp
ja short @3@58
call far ptr F_OVERFLOW@
@3@58:
push large 0
call far ptr _time
add sp,4
push ax
call far ptr _srand
add sp,2
ret
@@randomize$qv endp
@randomize$qv ends
C1_TEXT ends
C1_TEXT segment byte public use16 'CODE'
@random$qi segment virtual
assume cs:@random$qi
@@random$qi proc far
push bp
mov bp,sp
cmp word ptr __stklen,sp
ja short @4@86
call far ptr F_OVERFLOW@
@4@86:
call far ptr _rand
movsx eax,ax
movsx edx,word ptr [bp+6]
imul eax,edx
mov ebx,large 000008000h
cdq
idiv ebx
pop bp
ret
@@random$qi endp
@random$qi ends
C1_TEXT ends
_DATA segment word public use16 'DATA'
s@ label byte
db 0
db 0
db 0
db 'A'
db 0
db 0
db 200
db 'B'
_DATA ends
C1_TEXT segment byte public use16 'CODE'
C1_TEXT ends
extrn __turboFloat:word
public _main
extrn F_OVERFLOW@:far
extrn __stklen:word
public @linfit1$qxnxfxt1
public _b
public _a
public _i
public _y_calc
public _y
public _x
extrn _time:far
extrn _srand:far
extrn _rand:far
_atoi equ atoi
_abs equ abs
_s@ equ s@
end