1 Vote(s) - 4 Average 1 2 3 4 5 Math in Assembly NieXrlaM Lucifer Joined: Nov 2010 Posts: 11 Reputation: 1 11-06-2010, 01:57 - Math in Assembly By Ohad Klein And NieXrlaM (David) how to do Square root in assembly? the follow code will do this function Code: ```push Num call sqrt pop Num sqrt: pop eax fld DWORD PTR [eax] fsqrt fstp DWORD ptr[eax] push eax retn``` at c++ the code will be like this Code: ```inline float Sqrt(float Num) {     _asm     {         fld DWORD PTR [Num]         fsqrt         fstp DWORD ptr[Num]     }     return Num; }``` how to do Sine in assembly? the follow code will do this function Code: ```push Rad call Sine pop Rad Sine: pop eax fld DWORD PTR [eax] fsin fstp DWORD PTR [eax] push eax retn``` at c++ the code will be like this Code: ```inline float Sine(float Rad) {     _asm     {         fld DWORD PTR [Rad]         fsin         fstp DWORD PTR [Rad]     }     return Rad; }``` same at cosine just change from "fsin" to "fcos" how to do tangents in assembly? the follow code will do this function Code: ```push Rad call tan pop Rad tan: pop eax fld DWORD PTR [eax] fsincos fdiv fstp DWORD PTR [eax] push eax retn``` How i can Prove it ? answer.. sine(alpha)/cosine(alpha) = tangents(alpha) at c++ the code will be like this Code: ```inline float Tan(float Rad) {     _asm     {         fld DWORD PTR [Rad]         fsincos         fdiv         fstp DWORD PTR [Rad]     }     return Rad; }``` how to do Arc tangents in assembly? the follow code will do this function Code: ```push Rad call Atan pop Rad Atan: pop eax fld dword ptr [eax] fld1 fpatan fstp dword ptr [eax] push eax retn``` at c++ the code will be like this Code: ```inline float Atan(float Rad) {     _asm{     fld dword ptr [Rad]     fld1     fpatan     fstp dword ptr [Rad]     }     return Rad; }``` also .. if you want to do Asin or Acos functions .. you will use this logic (C++) Code: ```inline float Asin(float Rad) {     Rad = Sqrt(Rad*Rad/(1-Rad*Rad));     Rad = Atan(Rad);     return Rad; } inline float Acos(float Rad) {     Rad = Sqrt((1-Rad*Rad)/(Rad*Rad));     Rad = Atan(Rad);     return Rad; }``` How i can Prove it ? answer.. Asin(x) = Atan(((x*x/(1-x*x))^0.5) Acos(x) = Atan(((1-x*x)/(x*x))^0.5) how to do Exponentiation in assembly? the follow code will do this function Code: ```push Base push Power call Pow pop Num Pow: pop edx pop ebx fld DWORD PTR [edx] fld DWORD PTR [ebx] fld1 fsub fyl2xp1 sub     esp,16                                ; z = x*log2 fist    DWORD PTR [esp+12]            ; round fld1 fstp    TBYTE PTR [esp] fisub   DWORD PTR [esp+12]            ; z - round mov     eax, [esp+12] add     [esp+8],eax f2xm1 fld1 fadd fld     TBYTE PTR [esp]               ; 2^(round ) fmul                                  ; 2^z = e^x add     esp,16 fstp DWORD PTR [ebx] push ebx retn``` at c++ the code will be like this Code: ```inline float Pow(float Base, float Power) {     _asm     {         fld DWORD PTR [Power]         fld DWORD PTR [Base]         fld1         fsub         fyl2xp1         sub     esp,16                                ; z = x*log2         fist    DWORD PTR [esp+12]            ; round         fld1         fstp    TBYTE PTR [esp]         fisub   DWORD PTR [esp+12]            ; z - round         mov     eax, [esp+12]         add     [esp+8],eax         f2xm1         fld1         fadd         fld     TBYTE PTR [esp]               ; 2^(round )         fmul                                  ; 2^z = e^x         add     esp,16         fstp DWORD PTR [Base]     }     return Base; }``` For more functions download the attachment file Enjoy (and sorry for my english) Attached Files   Math-Assembly.rar (Size: 962 bytes / Downloads: 30) There are 10 types of people in the world, those who know binary code and those who not understand the joke ,, The following 3 users say Thank You to NieXrlaM for this post:3 users say Thank You to NieXrlaM for this post deadIce Recruit Joined: Nov 2010 Posts: 42 Reputation: 0 11-11-2010, 00:21 Interesting, how about mod (remainder)?   • skidz New Guy Joined: Oct 2011 Posts: 1 Reputation: 0 10-08-2011, 07:58 Great stuff, but I had a problem with your SinCos function. Code: ```inline void SinCos(float Rad, float &sinAns, float &cosAns) {     _asm     {         fld DWORD PTR [Rad]         fsincos         fstp    dword ptr [sinAns]         fstp    dword ptr [cosAns]     } }``` The first problem is the result from the function was always 0 for both sin and cos. I had to put the sinAns and cosAns into some registers for it to work. Code: ```inline void SinCos(float Rad, float &sinAns, float &cosAns) {     _asm     {         FLD        DWORD PTR [Rad]         FSINCOS         MOV        EAX, DWORD PTR [cosAns]         MOV        ECX, DWORD PTR [sinAns]         FSTP    DWORD PTR [EAX]         FSTP    DWORD PTR [ECX]     } }``` Second, I had to flip the cos and sine popping around so it gets cos first then sine. I am not sure why this is, because the documentation I read says Cos is in S0 and Sine is in S1. Very odd....   • NieXrlaM Lucifer Joined: Nov 2010 Posts: 11 Reputation: 1 10-08-2011, 08:36 (This post was last modified: 10-08-2011, 08:38 by NieXrlaM.) (10-08-2011, 07:58)skidz Wrote: Great stuff, but I had a problem with your SinCos function. Code: ```inline void SinCos(float Rad, float &sinAns, float &cosAns) {     _asm     {         fld DWORD PTR [Rad]         fsincos         fstp    dword ptr [sinAns]         fstp    dword ptr [cosAns]     } }``` The first problem is the result from the function was always 0 for both sin and cos. I had to put the sinAns and cosAns into some registers for it to work. Code: ```inline void SinCos(float Rad, float &sinAns, float &cosAns) {     _asm     {         fld DWORD PTR [Rad]         fsincos         mov eax, DWORD PTR[cosAns]         mov edx, DWORD PTR[sinAns]         fstp DWORD PTR[eax]         fstp DWORD PTR[edx]     } }``` Second, I had to flip the cos and sine popping around so it gets cos first then sine. I am not sure why this is, because the documentation I read says Cos is in S0 and Sine is in S1. Very odd.... yea.. this code is very old.. and not coded right, thnx for the Note There are 10 types of people in the world, those who know binary code and those who not understand the joke ,,   •

 Possibly Related Threads... Thread Author Replies Views Last Post [Release] Simple Math Commands Yamato 10 3,073 01-28-2013, 12:59 Last Post: Yamato [Tutorial] Reverse Engineering: A Beginner's Guide to x86 Assembly No One 1 2,574 11-26-2011, 21:59 Last Post: _Smile_Man_ x86 Assembly AimBoT Source v2.0 - Dll (Mw2) NieXrlaM 6 4,313 11-10-2011, 14:11 Last Post: NieXrlaM [Tutorial] Basic Assembly d0h! 1 3,206 02-12-2011, 21:42 Last Post: Ruffin[HD] x86 Assembly AimBoT Source v1.8 - Dll (Mw2) NieXrlaM 1 2,632 11-14-2010, 14:23 Last Post: [MPGH]House

Forum Jump:

Users browsing this thread: 1 Guest(s)