flat assembler
Message board for the users of flat assembler.
 Home   FAQ   Search   Register 
 Profile   Log in to check your private messages   Log in 
flat assembler > Macroinstructions > MOV turning into LEA

Author
Thread Post new topic Reply to topic
l4m2



Joined: 15 Jan 2015
Posts: 576
MOV turning into LEA
If you find any bug, just say about it here (and if you fix it I'd be apperciate):

Code:
macro mov op1op2 {
  if op1 in <cs,ds,es,fs,gs,ss> & op2 in <cs,ds,es,fs,gs,ss>
    push op2
    pop op1
  else if op1 eqtype eax & op2 eqtype eax+eax
    local caxcbxccxcdxcsicdicbpcspceaxcebxcecxcedxcesicedicebpcesp
    irp regaxbxcxdxsidibpspeaxebxecxedxesiediebpesp \{
      reg equ 0
    \}
    c = op2
    ax equ 1
    cax = op2 - c
    restore ax
    bx equ 1
    cbx = op2 - c    
    restore bx    
    cx equ 1    
    ccx = op2 - c    
    restore cx    
    dx equ 1    
    cdx = op2 - c    
    restore dx    
    si equ 1    
    csi = op2 - c    
    restore si    
    di equ 1    
    cdi = op2 - c    
    restore di    
    bp equ 1    
    cbp = op2 - c    
    restore bp    
    sp equ 1    
    csp = op2 - c    
    restore sp    
    eax equ 1    
    ceax = op2 - c    
    restore eax    
    ebx equ 1    
    cebx = op2 - c    
    restore ebx    
    ecx equ 1    
    cecx = op2 - c    
    restore ecx    
    edx equ 1    
    cedx = op2 - c    
    restore edx    
    esi equ 1    
    cesi = op2 - c    
    restore esi    
    edi equ 1    
    cedi = op2 - c    
    restore edi    
    ebp equ 1    
    cebp = op2 - c    
    restore ebp    
    esp equ 1    
    cesp = op2 - c    
    restore esp    
    q = 0
    irp regcaxcbxccxcdxcsicdicbpcsp \{
      if reg<>0
        q = q or 1
      end if
    \}
    irp regceaxcebxcecxcedxcesicedicebpcesp \{
      if reg<>0
        q = q or 2
      end if
    \}
    irp regaxbxcxdxsidibpspeaxebxecxedxesiediebpesp \{
      restore reg
    \}
    if q = 0
      mov op1op2
    else if q = 1 ;16 bit
      if op1 in <eaxebxecxedxesiediebpesp>
        err
      end if
      irp regcaxccxcdxcsp \{
        if reg<>0
          q = q or 4
        end if
      \}
      irp regcbxcbp \{
        if reg<0 | reg>1
          q = q or 4
        end if
        q = q + reg * 16
      \}
      irp regcsicdi \{
        if reg<0 | reg>1
          q = q or 4
        end if
        q = q + reg * 64
      \}
      if q and 164 <> 0
        c equ op1
        ax equ eax
        bx equ ebx
        cx equ ecx
        dx equ edx
        si equ esi
        di equ edi
        bp equ ebp
        sp equ esp
        lea c, [op2]
        irp regaxbxcxdxsidibpsp \{ restore reg \}
      else
        lea op1, [op2]
      end if
    else if q=2 ;32bit
      if op1 in <axbxcxdxsidibpsp>
        err
      end if
      lea op1, [op2]
    else
      err
    end if
  else
    mov op1op2
  end if


This doesn't work(using loops):

Code:
macro mov op1op2 {
  if op1 in <cs,ds,es,fs,gs,ss> & op2 in <cs,ds,es,fs,gs,ss>
    push op2
    pop op1
  else if op1 eqtype eax & op2 eqtype eax+eax
    local cdq
    macro catch dsrc \{d equ c#src\}
    irp regaxbxcxdxsidibpspeaxebxecxedxesiediebpesp \{
      catch dreg
      match rd \\{
        local r
      \\}
      reg equ 0
    \}
    c = op2
    irp regaxbxcxdxsidibpspeaxebxecxedxesiediebpesp \{
      reg equ 1
      catch dreg
      d = op2 - c
      restore reg
    \}
    q = 0
    irp regaxbxcxdxsidibpsp \{
      catch dreg
      dispint d
      if d<>0
        q = q or 1
      end if
      dispint d
    \}
    irp regeaxebxecxedxesiediebpesp \{
      catch dreg
      if d<>0
        q = q or 2
      end if
      dispint d
    \}
    irp regaxbxcxdxsidibpspeaxebxecxedxesiediebpesp \{
      restore reg
    \}
    if q = 0
      mov op1op2
    else if q = 1 ;16 bit
      if op1 in <eaxebxecxedxesiediebpesp>
        err
      end if
      irp regaxcxdxsp \{
        catch dreg
        if d<>0
          q = q or 4
        end if
      \}
      irp regbxbp \{
        catch dreg
        if d<0 | d>1
          q = q or 4
        end if
        q = q + d * 16
      \}
      irp regsidi \{
        catch dreg
        if d<0 | d>1
          q = q or 4
        end if
        q = q + d * 64
      \}
      if q and 164 <> 0
        ax equ eax
        bx equ ebx
        cx equ ecx
        dx equ edx
        si equ esi
        di equ edi
        bp equ ebp
        sp equ esp
        lea op1, [op2]
        irp regaxbxcxdxsidibpsp \{ restore reg \}
      end if
      lea op1, [op2]
    else if q=2 ;32bit
      if op1 in <axbxcxdxsidibpsp>
        err
      end if
      lea op1, [op2]
    else
      err
    end if
  else
    mov op1op2
  end if
}

Post 01 Aug 2016, 05:01
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >

Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001-2005 phpBB Group.

Main index   Download   Documentation   Examples   Message board
Copyright © 2004-2016, Tomasz Grysztar.