summaryrefslogtreecommitdiff
path: root/md/writeup/assembler_calculate_polynomial.md
diff options
context:
space:
mode:
Diffstat (limited to 'md/writeup/assembler_calculate_polynomial.md')
-rw-r--r--md/writeup/assembler_calculate_polynomial.md95
1 files changed, 95 insertions, 0 deletions
diff --git a/md/writeup/assembler_calculate_polynomial.md b/md/writeup/assembler_calculate_polynomial.md
new file mode 100644
index 0000000..8d680a0
--- /dev/null
+++ b/md/writeup/assembler_calculate_polynomial.md
@@ -0,0 +1,95 @@
+title:Assembler calculate polynomial
+keywords:assembler,c,math,polynomial
+
+# Assembler calculate polynomial
+Calculating polynomial with asm and C
+
+```asm
+format ELF
+section ".text" executable
+public poly
+align 4
+poly:
+a equ dword [ebp+8]
+b equ dword [ebp+12]
+c equ dword [ebp+16]
+x equ dword [ebp+20]
+ ;a*x*x+b*x+c
+ push ebp
+ mov ebp , esp
+ fld c
+ fld x
+ fld b
+ fld x
+ fld a
+ fmulp st1 , st0
+ faddp st1 , st0
+ fmulp st1 , st0
+ faddp st1 , st0
+ pop ebp
+ ret
+```
+
+For calculating polynomial used polish notation
+Wiki
+In other words a*x*x+b*x+c to reduce operations changed to (a*x+b)*x+c
+and then written out operation by priorities [*,+,*,+].
+Compiling this with lines
+
+```
+fasm poly.asm poly.o
+```
+
+```c
+#include <stdio.h>
+extern float poly( float , float , float , float );
+int main()
+{
+ float res = poly( 1.0 , 2.0 , 3.0 , 3.0 );
+ printf( "%f\n" , res );
+ return 0;
+}
+```
+
+
+Compiling this with lines
+```
+gcc -c main.c -o main.o
+```
+Combining
+```
+gcc main.o poly.o -o main
+```
+Update on 06.12.2009
+After running dome C code with FPU calculations and -O2 flag
+
+```asm
+format ELF
+section ".text" executable
+
+public poly
+align 4
+poly:
+a equ dword [ebp+8]
+b equ dword [ebp+12]
+c equ dword [ebp+16]
+x equ dword [ebp+20]
+ ;a*x*x+b*x+c
+ push ebp
+ mov ebp , esp
+
+ fld a
+ fmul x
+ fadd b
+ fmul x
+ fadd c
+
+ pop ebp
+ ret
+```
+
+Now only 5 instructions
+
+
+# Links
+http://en.wikipedia.org/wiki/Polish_notation