Zespół: PT/17/TP Wrocław, 09.04.2010
Elżbieta Tchorowska, 171067
Konrad Kukulski, 163930
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
Kod as
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;
}