flat assembler
Message board for the users of flat assembler.
  
       
      Index
      > Main > sorting the mathematical operations like this 2+10-2*4/3Goto page 1, 2 Next  | 
  
| Author | 
  | 
              
| 
                  
                   Roman 08 Jul 2013, 08:11 
                  I want sort by mathematical operations and break into groups. And then we get like this first -2*4=x then x/3=z and then 2+10=y and at last we have y+z
 
                I found a bug. If write CoolMath 2*99.99999 work, but if write CoolMath 2*199.99999 fasm swears for number 199.99999. Why ? I use Fasm version 1.69.03  | 
              |||
                  
  | 
              
| 
                  
                   revolution 08 Jul 2013, 10:24 
                  Roman wrote: I found a bug. If write CoolMath 2*99.99999 work, but if write CoolMath 2*199.99999 fasm swears for number 199.99999. Why ? Roman wrote: I use Fasm version 1.69.03  | 
              |||
                  
  | 
              
| 
                  
                   Roman 08 Jul 2013, 13:02 
                  Revolution
 
        compile this code. And you see. 
  | 
              |||||||||||
                  
  | 
              
| 
                  
                   uart777 08 Jul 2013, 18:25 
                  `s and \s are misplaced and if should be replaced with match. Try something like this:     
                Code: macro MATH [p] { forward define ?s 0 match a+b, p \{ display 'add ' define ?s 1 ; success \} match =0 a-b, ?s p \{ display 'sub ' define ?s 1 ; success \} match =0 a*b, ?s p \{ display 'mul ' define ?s 1 ; success \} match =0 a/b, ?s p \{ display 'div ' define ?s 1 ; success \} if ?s eq 0 ; no successful match? 'Syntax error' end if } Code: MATH a+b, a*b ; displays 'add mul'  | 
              |||
                  
  | 
              
| 
                  
                   Roman 09 Jul 2013, 07:00 
                  uart777
 
                Thanks But how get this: MATH a+b - a*b or MATH a+b + a*b or MATH a+b * a*b uart777 if we write MATH a+b, a*b then it is not clear how the operation will be between a+b and a*b  | 
              |||
                  
  | 
              
| 
                  
                   uart777 09 Jul 2013, 15:42 
                  What are you trying to do? Just learning and practicing? How to match this? a+b - a*b? Exactly as-is.     
                Code: match a+b - x*y, p { ; ... } Code: match (i==0=,i<n=,i++), p { ; match (i=0,i<n,i++) ; ... }  | 
              |||
                  
  | 
              
| 
                  
                   Roman 10 Jul 2013, 17:28 
                  Now I am writing hands actions for different operations. But how is it easier with macros? The more operations, the more combinations will have to write your hands. It's like a sad write hands:(
 
                Code: macro MMXFlt2 Mesto,[p]{ Dons EQU No match a+b - x*y, p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 subss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes ;cvtss2si eax,xmm1 ;convert to integer number \} match =No a+b + x*y, Dons p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 addss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes \} match =No a+b * x*y, Dons p \{ mov eax,a movd xmm1,eax mov eax,b movd xmm2,eax ;addss xmm1,xmm2 mov eax,x movd xmm3,eax mov eax,y movd xmm4,eax mulss xmm3,xmm4 mulss xmm3,xmm2 addss xmm1,xmm3 movss [Mesto],xmm1 Dons EQU Yes \} }  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 10 Jul 2013, 22:19 
                  Here is another possibility:     
Code: ; stack of registers rept 8 i:0 { XREG equ xmm#i } macro def_XMMath { macro XMMath [str*] \{ common define OK = def_XMMath ; allow recursion ; low precedence operations first match R == A + B,XREG OK str \\{ restore OK define OK , XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B addss R,XREG XREG equ R \\} match R == A * B,XREG OK str \\{ restore OK define OK , XMMath A ; recurse on A restore XREG XMMath B ; recurse on B mulss R,XREG XREG equ R \\} ; no match, assume memory value match R ==,XREG OK \\{ movss R,str \\} purge XMMath restore OK \} } def_XMMath ; Example of use: _dv dd 9.80665 _dx dd 1.973 _t dd 9.12345 _x0 dd -5.0 entry $ ; generate code to put result in XMM7 (top of stack register) XMMath [_dv] * [_t] * [_t] + [_dx] * [_t] + [_x0] Less manual work by programmer, though. (Partly based on the discussion here.) _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply.  | 
              |||
                  
  | 
              
| 
                  
                   Roman 11 Jul 2013, 06:43 
                  bitRAKE thanks !
 
                Mama Mia ! Incredible and amazing example ! Sad fact that in this way macros are not considered in the documentation on FASM Why ?  | 
              |||
                  
  | 
              
| 
                  
                   Roman 11 Jul 2013, 07:38 
                  bitRAKE
 
                Thanks for help. If you know, please tell me about this. In macro (for example Val equal [_dx]*[_x0] ) if i write movss xmm1,Val Fasm will give an error, because we get movss xmm1,[_dx]*[_x0]. But how to make the Val equal [_x0] (and not using match)? I mean depose Val to [_x0]. This can be done without match?  | 
              |||
                  
  | 
              
| 
                  
                   Roman 11 Jul 2013, 08:00 
                  Sad  
                XMMath [_t]/[_t]/[_dv] get value 2.0 ! This is wrong , must be 0.5 ! _dv dd 2.0 _t dd 4.0  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 12 Jul 2013, 00:46 
                  Topic was kind of split.
 
                Answer should be here, too: Code: match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\}  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 12 Jul 2013, 01:56 
                  Roman wrote: In macro (for example Val equal [_dx]*[_x0] ) p.s. You don't need to PM me for every question. I will respond to the thread if I can. My email is at gmail if you have something private, or want to pay me (paypal) for more prompt replies. Otherwise just be patient, please. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply.  | 
              |||
                  
  | 
              
| 
                  
                   Roman 12 Jul 2013, 08:49 
                  bitRAKE
 
                this work if we using only 3 operations But how to make this code more versatile(i mean using in macro)? Code: match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\} How to write this example for the next combination? XMMath [_t]/[_t]/[_dv]/../.../ (i mean we dont know how much operations div were. Maybe 4 operations or maybe 7 operations)  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 12 Jul 2013, 10:18 
                  I'm sorry it was not clear. Use both and it works for any number of "/" operations.  
Code: ; stack of availible registers rept 16 i:0 { XREG equ xmm#i } ; amd64 mode macro def_XMMath { macro XMMath [str*] \{ common define OK = def_XMMath ; allow recursion ; low precedence functions first match R == A + B,XREG OK str \\{ restore OK define OK XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B addss R,XREG XREG equ R \\} match R == A - B,XREG OK str \\{ restore OK define OK XMMath A ; recurse on A restore XREG ; preserve value XMMath B ; recurse on B subss R,XREG XREG equ R \\} match R == A * B,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B mulss R,XREG XREG equ R \\} match R == A / B / C,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R XMMath R / C \\} match R == A / B,XREG OK str \\{ restore OK define OK XMMath A restore XREG XMMath B divss R,XREG XREG equ R \\} ; no match, assume memory value match R ==,XREG OK \\{ ; skip top of stack register match =R,str \\\{ restore OK define OK \\\} match ==,OK \\\{ movss R,str \\\} \\} purge XMMath restore OK \} } def_XMMath For example, the register stack could be the 64-bit registers r8-r15, and the instructions could be changed to use basic integer arithmetic, or fixed point code, etc. A slight adaptation would even work for the FPU math. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply.  | 
              |||
                  
  | 
              
| 
                  
                   Roman 12 Jul 2013, 11:31 
                  bitRAKE
 
                Thanks again ! But there is one point, you macro XMMath generated a lot of extra commands. I mean XMMath [_dv]/[_dv]/[_dv]/[_t]+[_t] We get 11 SSE commands ! If write hands we write 5 SSE commands ! if we write a lot of similar (XMMath [_dv]/[_dv]/[_dv]/[_t]+[_t]) we get a lot of extra commands ! In any case, your macro zingy  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 12 Jul 2013, 12:27 
                  Hmm...maybe you can figure out an optimization to improve the code generation. For example, if B is a register or memory location then it can be used directly in the instruction.
 
                I wonder if the "no match" case could assign the string to another symbol which would work as the second operand to the instructions? Probably something like that.  | 
              |||
                  
  | 
              
| 
                  
                   Roman 12 Jul 2013, 12:35 
                  bitRAKE
 
                What about this XMMath [_dv]/2.0/[_dv]/[_t]+11.11  | 
              |||
                  
  | 
              
| 
                  
                   bitRAKE 12 Jul 2013, 20:25 
                  Processing constants aren't that difficult.     
Code: match R == _ A,XREG OK str \\{ < store constant somewhere and reference it > \\} Different prefixes could be used for integers and float. Could detect common constants for special handling - like 0,+/-1, etc. _________________ ¯\(°_o)/¯ AI may [not] have aided with the above reply.  | 
              |||
                  
  | 
              
| Goto page 1, 2  Next < Last Thread | Next Thread >  | 
    
Forum Rules: 
  | 
    
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.