C_far

FRM & Local, relative and global address

Jul 1st, 2016
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 2.82 KB | None | 0 0
  1. #include "a_samp"
  2.  
  3. main()
  4. {      
  5.     new
  6.         variable = 123456789,
  7.         frame_pointer,
  8.         local_address,
  9.         relative_address,
  10.         data = GetAmxRealData(),
  11.         global_address;
  12.  
  13.     /**
  14.     **\
  15.         frame_pointer + local_address = relative_address
  16.         relative_address + data = global_address
  17.  
  18.         reg.x = registre ...
  19.         hdr.x = header ...
  20.         seg.x = segment ...
  21.         var.x = variable ...
  22.         frm = frame pointer
  23.        
  24.     **/
  25.  
  26.     // Get Frame Pointer
  27.     #emit LCTRL 5 // reg.pri = frm
  28.     #emit STOR.S.pri frame_pointer // var.frame_pointer = reg.pri
  29.     // Get Frame Pointer
  30.    
  31.     // pri = Frame pointer
  32.    
  33.     // Get local address
  34.     #emit CONST.alt variable // reg.alt = local address of var.variable
  35.     #emit STOR.S.alt local_address // var.local_address = reg.alt
  36.     // Get local address
  37.    
  38.     // alt = Local address
  39.    
  40.     // Get relative address
  41.     #emit ADD // reg.pri += reg.alt
  42.     #emit STOR.S.pri relative_address // var.relative_address = reg.pri
  43.     // Get relative address
  44.    
  45.     // pri = Relative address
  46.    
  47.     // Get global address
  48.     #emit LOAD.S.alt data // reg.alt = var.data
  49.     #emit ADD // reg.pri += reg.alt
  50.     #emit STOR.S.pri global_address // var.global_address = reg.pri
  51.     // Get global address
  52.    
  53.     printf("frame_pointer : 0x%x | %d", frame_pointer, frame_pointer);
  54.     printf("local_address : 0x%x | %d", local_address, local_address);
  55.     printf("relative_address : 0x%x | %d", relative_address, relative_address);
  56.     printf("data : 0x%x | %d", data, data);
  57.     printf("global_address : 0x%x | %d", global_address, global_address);
  58. }
  59.  
  60. stock GetAmxRealData()
  61. {
  62.     /**
  63.    
  64.         reg.x = registre ...
  65.         hdr.x = header ...
  66.         seg.x = segment ...
  67.         var.x = variable ...
  68.        
  69.     **/
  70.  
  71.     new
  72.         addr,
  73.         cod,
  74.         base;
  75.        
  76.     #emit LCTRL 1 // reg.pri = hdr.data
  77.     #emit NEG // reg.pri = -reg.pri
  78.     #emit ADD.C 12 // reg.pri += 12
  79.     #emit STOR.S.pri addr // var.addr = reg.pri
  80.    
  81.     #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
  82.     #emit STOR.S.pri cod // var.cod = reg.pri
  83.     addr += 4;
  84.    
  85.     #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
  86.     #emit NEG // reg.pri = -reg.pri
  87.     #emit STOR.S.pri base // var.base = reg.pri
  88.     cod += base;
  89.        
  90.     amx_nothing();
  91.    
  92.     #emit LCTRL 6 // reg.pri = seg.cip
  93.     #emit ADD.C 0xFFFFFFF4 // reg.pri += 0xFFFFFFF4 (-12) = reg.pri -= 12 (SUB.C n'existe pas/doesn't exist)
  94.     #emit LOAD.S.alt cod // reg.alt = var.cod
  95.     #emit ADD // reg.pri += reg.alt
  96.     #emit STOR.S.pri addr // var.addr = reg.pri
  97.     #emit LREF.S.pri addr // reg.pri = *(seg.data + var.addr)
  98.     #emit SUB // reg.pri -= reg.alt
  99.     #emit CONST.alt amx_nothing
  100.     #emit SUB // reg.pri -= reg.alt
  101.     #emit MOVE.alt // reg.alt = reg.pri
  102.     #emit LCTRL 1 // reg.pri = hdr.data
  103.     #emit XCHG // reg.pri = reg.alt | reg.alt = reg.pri
  104.     #emit SUB // reg.pri -= reg.alt
  105.     #emit STOR.S.pri addr // var.addr = reg.pri (addr = real address)
  106.    
  107.     return addr - base;
  108. }
  109.  
  110. static amx_nothing()
  111. {
  112.     return 0;
  113. }
Advertisement