Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы 1-4.doc
Скачиваний:
29
Добавлен:
01.05.2014
Размер:
421.38 Кб
Скачать

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