Difference between revisions of "Help File:old flash (div 8)"
Jump to navigation
Jump to search
Line 1: | Line 1: | ||
+ | [[Category:Help]] | ||
== Divide by 8 (old flash) == | == Divide by 8 (old flash) == | ||
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]