Difference between revisions of "Help File:old flash (div 8)"

From Cheat Engine
Jump to navigation Jump to search
(Created page with '<hr><div align="left"><font face="Arial" color="#010101" class="Arial2"> This is just the money type adjusted to 8 (in case you didn't get it in the previous example)</font></d…')
 
Line 1: Line 1:
<hr><div align="left"><font face="Arial"  color="#010101"  class="Arial2">
+
== Divide by 8 (old flash) ==
This is just the money type adjusted to 8 (in case you didn't get it in the previous example)</font></div><div align="left"><font face="Arial"  color="#010101"  class="Arial2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
 
alloc(TypeName,256)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
 
alloc(ByteSize,4)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
This is just the money type adjusted to 8 (in case you didn't get it in the previous example).
alloc(ConvertRoutine,1024)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
 
alloc(ConvertBackRoutine,1024)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
 
TypeName:</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  alloc(TypeName,256)
db 'Civ 5 Float',0</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  alloc(ByteSize,4)
ByteSize:</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  alloc(ConvertRoutine,1024)
dd 4</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  alloc(ConvertBackRoutine,1024)
//The convert routine should hold a routine that converts the data to an  
+
  &nbsp;
nteger (in eax)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
//function declared as: stdcall int ConvertRoutine(unsigned char  
+
  TypeName:
*input);</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  db 'Civ 5 Float',0
//Note: Keep in mind that this routine can be called by multiple threads  
+
  &nbsp;
at the same time.</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
ConvertRoutine:</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  ByteSize:
[32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  dd 4
push ebp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
mov ebp,esp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
push ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //The convert routine should hold a routine that converts the data to an nteger (in eax)
mov ecx,[ebp+8]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //function declared as: stdcall int ConvertRoutine(unsigned char *input);
[/32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
//at this point ecx contains the address where the bytes are stored</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
//save the used registers</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //Note: Keep in mind that this routine can be called by multiple threads at the same time.
push edx //fun fact about ce's assembler, because push ebx does not  
+
  &nbsp;
exist in 64-bit it becomes the 64-bit push rdx automatically</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
push ebx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  ConvertRoutine:
//put the bytes into the eax register</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [32-bit]
mov eax,[ecx] //second fun fact, addressing with 32-bit registers  
+
  push ebp
doesn't work in 64-bit, it becomes a 64-bit automatically (most of the  
+
  mov ebp,esp
time)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push ecx
xor edx,edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  mov ecx,[ebp+8]
mov ebx,#8</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [/32-bit]
div ebx //divide eax by 8and put the result in eax (and leftover in edx)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
pop ebx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
pop edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //at this point ecx contains the address where the bytes are stored
//and now exit the routine</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //save the used registers
[64-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  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
ret</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push ebx
[/64-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
[32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
pop ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //put the bytes into the eax register
pop ebp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  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)
ret 4</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
[/32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
//The convert back routine should hold a routine that converts the given  
+
  xor edx,edx
integer back to a row of bytes (e.g when the user wats to write a new  
+
  mov ebx,#8
value)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  div ebx //divide eax by 8and put the result in eax (and leftover in edx)
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned  
+
  &nbsp;
char *output);</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
ConvertBackRoutine:</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  pop ebx
[32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  pop edx
push ebp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //and now exit the routine
mov ebp,esp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [64-bit]
push edx //save the registers</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  ret
push ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [/64-bit]
mov edx,[ebp+0c]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [32-bit]
mov ecx,[ebp+08]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  pop ecx
[/32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  pop ebp
//at this point edx contains the address to write the value to</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  ret 4
//and ecx contains the value</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [/32-bit]
push eax</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
push edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
push ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //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)
mov eax,ecx //eax gets the given value</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
xor edx,edx //clear edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  ConvertBackRoutine:
mov ecx,#8</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [32-bit]
mul ecx //multiply eax and put the results into edx:eax (edx is ignored  
+
  push ebp
for this routine)</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  mov ebp,esp
pop ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push edx //save the registers
pop edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push ecx
mov [edx],eax</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  mov edx,[ebp+0c]
pop eax</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  mov ecx,[ebp+08]
[64-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  [/32-bit]
//everything is back to what it was, so exit</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
ret</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
[/64-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2"><br></font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //at this point edx contains the address to write the value to
[32-bit]</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  //and ecx contains the value
//cleanup first</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push eax
pop ecx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push edx
pop edx</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  push ecx
pop ebp</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
ret 8</font></div><div align="left"><font face="Courier New"  color="#010101"  class="CourierNew2">
+
  &nbsp;
[/32-bit] </font></div><div align="left">&nbsp;&nbsp;</div>
+
  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)
 +
  &nbsp;
 +
  &nbsp;
 +
  pop ecx
 +
  pop edx
 +
  mov [edx],eax
 +
  pop eax
 +
  &nbsp;
 +
  &nbsp;
 +
  [64-bit]
 +
  //everything is back to what it was, so exit
 +
  ret
 +
  [/64-bit]
 +
  &nbsp;
 +
  &nbsp;
 +
  [32-bit]
 +
  //cleanup first
 +
  pop ecx
 +
  pop edx
 +
  pop ebp
 +
  ret 8
 +
  [/32-bit]
 +
 
 +
 
 +
== Links ==
 +
* [[Cheat Engine:Help File|Help File]]
 +
 
 +
* [[Help_File:Money_type|Back]]
 +
 
 +
* [[Help_File:Big_endian_2_byte|Next]]

Revision as of 07:57, 10 March 2017

Divide by 8 (old flash)

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