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

Latest revision as of 12:15, 19 March 2017

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]