Difference between revisions of "Help File:old flash (div 8)"
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: | ||
− | + | == 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) | + | This is just the money type adjusted to 8 (in case you didn't get it in the previous example). |
− | alloc(ConvertRoutine,1024) | + | |
− | alloc(ConvertBackRoutine,1024) | + | |
− | TypeName: | + | alloc(TypeName,256) |
− | db 'Civ 5 Float',0 | + | alloc(ByteSize,4) |
− | ByteSize: | + | alloc(ConvertRoutine,1024) |
− | dd 4 | + | alloc(ConvertBackRoutine,1024) |
− | //The convert routine should hold a routine that converts the data to an | + | |
− | nteger (in eax) | + | |
− | //function declared as: stdcall int ConvertRoutine(unsigned char | + | TypeName: |
− | *input); | + | db 'Civ 5 Float',0 |
− | //Note: Keep in mind that this routine can be called by multiple threads | + | |
− | at the same time. | + | |
− | ConvertRoutine: | + | ByteSize: |
− | [32-bit] | + | dd 4 |
− | push ebp | + | |
− | mov ebp,esp | + | |
− | push ecx | + | //The convert routine should hold a routine that converts the data to an nteger (in eax) |
− | mov ecx,[ebp+8] | + | //function declared as: stdcall int ConvertRoutine(unsigned char *input); |
− | [/32-bit] | + | |
− | //at this point ecx contains the address where the bytes are stored | + | |
− | //save the used registers | + | //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 | + | |
− | exist in 64-bit it becomes the 64-bit push rdx automatically | + | |
− | push ebx | + | ConvertRoutine: |
− | //put the bytes into the eax register | + | [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) | + | push ecx |
− | xor edx,edx | + | mov ecx,[ebp+8] |
− | mov ebx,#8 | + | [/32-bit] |
− | div ebx //divide eax by 8and put the result in eax (and leftover in edx) | + | |
− | pop ebx | + | |
− | pop edx | + | //at this point ecx contains the address where the bytes are stored |
− | //and now exit the routine | + | //save the used registers |
− | [64-bit] | + | 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 | + | push ebx |
− | [/64-bit] | + | |
− | [32-bit] | + | |
− | pop ecx | + | //put the bytes into the eax register |
− | pop ebp | + | 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 | + | |
− | [/32-bit] | + | |
− | //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) | + | div ebx //divide eax by 8and put the result in eax (and leftover in edx) |
− | //function declared as: stdcall void ConvertBackRoutine(int i, unsigned | + | |
− | char *output); | + | |
− | ConvertBackRoutine: | + | pop ebx |
− | [32-bit] | + | pop edx |
− | push ebp | + | //and now exit the routine |
− | mov ebp,esp | + | [64-bit] |
− | push edx //save the registers | + | ret |
− | push ecx | + | [/64-bit] |
− | mov edx,[ebp+0c] | + | [32-bit] |
− | mov ecx,[ebp+08] | + | pop ecx |
− | [/32-bit] | + | pop ebp |
− | //at this point edx contains the address to write the value to | + | ret 4 |
− | //and ecx contains the value | + | [/32-bit] |
− | push eax | + | |
− | push edx | + | |
− | push ecx | + | //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 | + | //function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output); |
− | xor edx,edx //clear edx | + | ConvertBackRoutine: |
− | mov ecx,#8 | + | [32-bit] |
− | mul ecx //multiply eax and put the results into edx:eax (edx is ignored | + | push ebp |
− | for this routine) | + | mov ebp,esp |
− | pop ecx | + | push edx //save the registers |
− | pop edx | + | push ecx |
− | mov [edx],eax | + | mov edx,[ebp+0c] |
− | pop eax | + | mov ecx,[ebp+08] |
− | [64-bit] | + | [/32-bit] |
− | //everything is back to what it was, so exit | + | |
− | ret | + | |
− | [/64-bit] | + | //at this point edx contains the address to write the value to |
− | [32-bit] | + | //and ecx contains the value |
− | //cleanup first | + | push eax |
− | pop ecx | + | push edx |
− | pop edx | + | push ecx |
− | pop ebp | + | |
− | ret 8 | + | |
− | [ | + | 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 == | ||
+ | * [[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]