diff options
Diffstat (limited to 'md/writeup/assembler_calculate_polynomial.md')
-rw-r--r-- | md/writeup/assembler_calculate_polynomial.md | 95 |
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 |