C_far icon

FRM & Local, relative and global address

C_far | PRO | 07/01/16 09:59:14 AM UTC | 0 ⭐ | 7370 👁️ | Never ⏰ | []
Pawn |

2.82 KB

|

None

|

0 👍

/

0 👎

#include "a_samp"
 
main()
{      
    new
        variable = 123456789,
        frame_pointer,
        local_address,
        relative_address,
        data = GetAmxRealData(),
        global_address;
 
    /**
    **\
        frame_pointer + local_address = relative_address
        relative_address + data = global_address 
 
        reg.x = registre ...
        hdr.x = header ...
        seg.x = segment ...
        var.x = variable ...
        frm = frame pointer
        
    **/
 
    // Get Frame Pointer
    #emit LCTRL 5 // reg.pri = frm
    #emit STOR.S.pri frame_pointer // var.frame_pointer = reg.pri
    // Get Frame Pointer
   
    // pri = Frame pointer
   
    // Get local address
    #emit CONST.alt variable // reg.alt = local address of var.variable
    #emit STOR.S.alt local_address // var.local_address = reg.alt
    // Get local address
    
    // alt = Local address
    
    // Get relative address
    #emit ADD // reg.pri += reg.alt
    #emit STOR.S.pri relative_address // var.relative_address = reg.pri
    // Get relative address
    
    // pri = Relative address
    
    // Get global address
    #emit LOAD.S.alt data // reg.alt = var.data
    #emit ADD // reg.pri += reg.alt
    #emit STOR.S.pri global_address // var.global_address = reg.pri
    // Get global address
   
    printf("frame_pointer : 0x%x | %d", frame_pointer, frame_pointer);
    printf("local_address : 0x%x | %d", local_address, local_address);
    printf("relative_address : 0x%x | %d", relative_address, relative_address);
    printf("data : 0x%x | %d", data, data);
    printf("global_address : 0x%x | %d", global_address, global_address);
}
 
stock GetAmxRealData()
{
    /**
    
        reg.x = registre ...
        hdr.x = header ...
        seg.x = segment ...
        var.x = variable ...
        
    **/
 
    new
        addr,
        cod,
        base;
        
    #emit LCTRL 1 // reg.pri = hdr.data
    #emit NEG // reg.pri = -reg.pri
    #emit ADD.C 12 // reg.pri += 12
    #emit STOR.S.pri addr // var.addr = reg.pri
    
    #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
    #emit STOR.S.pri cod // var.cod = reg.pri
    addr += 4;
    
    #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
    #emit NEG // reg.pri = -reg.pri
    #emit STOR.S.pri base // var.base = reg.pri
    cod += base;
        
    amx_nothing();
    
    #emit LCTRL 6 // reg.pri = seg.cip
    #emit ADD.C 0xFFFFFFF4 // reg.pri += 0xFFFFFFF4 (-12) = reg.pri -= 12 (SUB.C n'existe pas/doesn't exist)
    #emit LOAD.S.alt cod // reg.alt = var.cod
    #emit ADD // reg.pri += reg.alt
    #emit STOR.S.pri addr // var.addr = reg.pri
    #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
    #emit SUB // reg.pri -= reg.alt
    #emit CONST.alt amx_nothing 
    #emit SUB // reg.pri -= reg.alt
    #emit MOVE.alt // reg.alt = reg.pri
    #emit LCTRL 1 // reg.pri = hdr.data
    #emit XCHG // reg.pri = reg.alt | reg.alt = reg.pri
    #emit SUB // reg.pri -= reg.alt
    #emit STOR.S.pri addr // var.addr = reg.pri (addr = real address)
    
    return addr - base;
}
 
static amx_nothing()
{
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎