Architektura komputerów lab3 pop, Studia, PWR, 4 semestr, Architektura komputerów 2, laboratoria


Zespół: PT/17/TP Wrocław, 09.04.2010

Elżbieta Tchorowska, 171067

0x08 graphic
Konrad Kukulski, 163930

0x08 graphic
Ocena:

Oddano:

Moduł as w programach C na platformie Linux

Sprawozdanie z laboratorium z przedmiotu „Architektura Komputerów”

Rok. Akadem. 2009/2010, Kierunek: INF

PROWADZĄCY:

Mgr inż. Mariusz Czapski

Spis treści:

Cel ćwiczenia

Celem ćwiczenia było napisanie funkcji, obliczającej sinus z szeregu Taylora. Argumentem miała być wielkość podawana w stopniach. Można byłoby wykonać to polecenie również używając funkcji fsin na koprocesorze, jednak wybraliśmy ten sposób.

Algorytm

Szereg Taylora wygląda następująco:

sin=suma (-1)^n/(2n+1)! * x^(2n+1)

Rozpoczęliśmy od napisania tego kodu w C i przekodowania go na język as.

Kod C

0x08 graphic

Kod as

0x08 graphic

0x08 graphic

0x08 graphic

Wnioski

Program działa poprawnie i poprawnie oblicza wartość funkcji sinus.

Strona 5 z 5

.LC3:

.long 1374389535

.long 1074339512

.align 4

.LC4:

.long 2143289344

.L9:

fldz

fstpl -40(%ebp)

fldz

fstpl -32(%ebp)

fldz

fstpl -24(%ebp)

movl $0, -4(%ebp)

jmp .L3

.L4:

movl -16(%ebp), %eax

pushl %eax

fildl (%esp)

leal 4(%esp), %esp

fldl -40(%ebp)

fmulp %st, %st(1)

fstpl -40(%ebp)

addl $1, -4(%ebp)

.L3:

movl -8(%ebp), %eax

addl %eax, %eax

addl $1, %eax

cmpl -4(%ebp), %eax

jg .L4

movl $1, -4(%ebp)

jmp .L5

.L6:

fildl -4(%ebp)

fldl -32(%ebp)

fmulp %st, %st(1)

fstpl -32(%ebp)

addl $1, -4(%ebp)

.L5:

movl -8(%ebp), %eax

addl %eax, %eax

addl $1, %eax

cmpl -4(%ebp), %eax

jge .L6

movl $1, -4(%ebp)

jmp .L7

.L8:

fldl -24(%ebp)

fchs

fstpl -24(%ebp)

addl $1, -4(%ebp)

.L7:

movl -4(%ebp), %eax

cmpl -8(%ebp), %eax

jle .L8

fldl -40(%ebp)

fmull -24(%ebp)

fdivl -32(%ebp)

fstpl -48(%ebp)

addl $1, -8(%ebp)

.L2:

movl -12(%ebp), %eax

cmpl %eax, -8(%ebp)

jl .L9

flds .LC4

leave

ret

.size funkcja, .-funkcja

.section .rodata

.align 8

.LC0:

.string "%d%d"

.text

.global funkcja

funkcja:

pushl %ebp //odłożenie ebp na stos

movl %esp, %ebp //wczytanie wartości

subl $88, %esp //początkowych

leal -16(%ebp), %eax

movl %eax, 8(%esp)

leal -12(%ebp), %eax

movl %eax, 4(%esp)

movl $.LC0, (%esp)

call scant //wywołanie funkcji scanf

fld1

fstpl -24(%ebp)

fld1

fstpl -32(%ebp)

fld1

fstpl -40(%ebp)

fldz

fstpl -48(%ebp)

movl -16(%ebp), %eax

pushl %eax

fildl (%esp)

leal 4(%esp), %esp

fldl .LC3

fmulp %st, %st(1)

fnstcw -50(%ebp)

movzwl -50(%ebp), %eax

movb $12, %ah

movw %ax, -52(%ebp)

fldcw -52(%ebp)

fistpl -56(%ebp)

fldcw -50(%ebp)

movl -56(%ebp), %eax

movl %eax, -16(%ebp)

movl -16(%ebp), %ecx

movl $-1240768329, -68(%ebp)

movl -68(%ebp), %eax

imull %ecx

leal (%edx,%ecx), %eax

movl %eax, %edx

sarl $7, %edx

movl %ecx, %eax

sarl $31, %eax

movl %edx, %ecx

subl %eax, %ecx

movl %ecx, %eax

movl %eax, -16(%ebp)

movl $0, -8(%ebp)

jmp .L2

float funkcja(){

int i,n,l,x;

scant("%d%d",&l,&x);

double potega=1, silnia=1, potx=1, wynik=0;

x=x*3.14;

x=x/180;

for(n=0;n<l;n=n+1){

potx=0;

silnia=0;

potega=0;

for(i=0;i<2*n+1;i=i+1){

potx=potx*x;

}

for(i=1;i<=2*n+1;i=i+1){

silnia=silnia*i;

}

for(i=1;i<=n;i++){

potega=potega*(-1);

}

wynik=potx*potega/silnia;

}



Wyszukiwarka