Help File:old flash (div 8)

From Cheat Engine
Jump to navigation Jump to search

Divide by 8 (old flash)[edit]

This is just the money type adjusted to 8 (in case you didn't get it in the previous example).


 alloc(TypeName,256)
 alloc(ByteSize,4)
 alloc(ConvertRoutine,1024)
 alloc(ConvertBackRoutine,1024)
  
  
 TypeName:
 db 'Civ 5 Float',0
  
  
 ByteSize:
 dd 4
  
  
 //The convert routine should hold a routine that converts the data to an nteger (in eax)
 //function declared as: stdcall int ConvertRoutine(unsigned char *input);
  
  
 //Note: Keep in mind that this routine can be called by multiple threads at the same time.
  
  
 ConvertRoutine:
 [32-bit]
 push ebp
 mov ebp,esp
 push ecx
 mov ecx,[ebp+8]
 [/32-bit]
  
  
 //at this point ecx contains the address where the bytes are stored
 //save the used registers
 push edx //fun fact about ce's assembler, because push ebx does not exist in 64-bit it becomes the 64-bit push rdx automatically
 push ebx
  
  
 //put the bytes into the eax register
 mov eax,[ecx] //second fun fact, addressing with 32-bit registers doesn't work in 64-bit, it becomes a 64-bit automatically (most of the time)
  
  
 xor edx,edx
 mov ebx,#8
 div ebx //divide eax by 8and put the result in eax (and leftover in edx)
  
  
 pop ebx
 pop edx
 //and now exit the routine
 [64-bit]
 ret
 [/64-bit]
 [32-bit]
 pop ecx
 pop ebp
 ret 4
 [/32-bit]
  
  
 //The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value)
 //function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
 ConvertBackRoutine:
 [32-bit]
 push ebp
 mov ebp,esp
 push edx //save the registers
 push ecx
 mov edx,[ebp+0c]
 mov ecx,[ebp+08]
 [/32-bit]
  
  
 //at this point edx contains the address to write the value to
 //and ecx contains the value
 push eax
 push edx
 push ecx
  
  
 mov eax,ecx //eax gets the given value
 xor edx,edx //clear edx
 mov ecx,#8
 mul ecx //multiply eax and put the results into edx:eax (edx is ignored for this routine)
  
  
 pop ecx
 pop edx
 mov [edx],eax
 pop eax
  
  
 [64-bit]
 //everything is back to what it was, so exit
 ret
 [/64-bit]
  
  
 [32-bit]
 //cleanup first
 pop ecx
 pop edx
 pop ebp
 ret 8
 [/32-bit] 
 

Links[edit]