Difference between revisions of "Tutorial:CodeInjection Floats"
(Created page with '<!-- Tutorial:CodeInjection_Floats --> Category:Tutorial Category:Auto Assembler {{DISPLAYTITLE:Code Injection - Working with Floats}} This tutorial builds on the topic o…') |
|||
Line 33: | Line 33: | ||
someMem: | someMem: | ||
//... | //... | ||
− | + | movss xmm0,[someSymbol] | |
addss [eax+10],xmm0 | addss [eax+10],xmm0 | ||
//... | //... |
Revision as of 12:42, 7 May 2018
This tutorial builds on the topic of Code Injection:
- Code Injection - Basic injection
- Code Injection - Full injection
- Code Injection - Adding Editable Values
- Code Injection - Working with Integers
- Code Injection - Working with Floats
Let's say you have a float and some code that increases the value.
addss [eax+10],xmm0
- Note: SS is for singles and SD is for doubles.
What if what writes to the value is only a MOVSS. Try to find a spot above the write instruction that has an ADDSS (or a SUBSS depending on what you want to do).
addss xmm0,xmm1 //... movss [eax+10],xmm0
Contents
Editable value
We could use a label, giving it some memory. And optionally register it so the label can be used on the table as an address.
//... alloc(someMem, 0x400) //... label(someSymbol) registerSymbol(someSymbol) //... someMem: //... movss xmm0,[someSymbol] addss [eax+10],xmm0 //... jmp return //... someSymbol: dd (float)100 //...
Adding a Multiplier
We could add an editable value like above but use MULSS to add a multiplier to the script.
//... alloc(someMem, 0x400) //... label(someSymbol) registerSymbol(someSymbol) //... someMem: //... mulss xmm0,[someSymbol] addss [eax+10],xmm0 //... jmp return //... someSymbol: dd (float)100 //...
Calculate a value for a Multiplier
Let's say we just can't find an ADDSS or a SUBSS, and all we have is a MOVSS.
movss [eax+10],xmm0
We can just do some math in the script, to calculate a value for a multiplier.
//... alloc(someMem, 0x400) //... label(someSymbol) registerSymbol(someSymbol) //... someMem: //... subss xmm0,[eax+10] mulss xmm0,[someSymbol] addss xmm0,[eax+10] movss [eax+10],xmm0 //... jmp return //... someSymbol: dd (float)10 //...
Working with doubles
Let's say the game use doubles, we can use ADDSD, SUBSD, MULSD, and MOVSD instead. We just need to also make our scripts value a double.
movsd [eax+10],xmm0
So to calculate a value for a multiplier.
//... alloc(someMem, 0x400) //... label(someSymbol) registerSymbol(someSymbol) //... someMem: //... subsd xmm0,[eax+10] mulsd xmm0,[someSymbol] addsd xmm0,[eax+10] movsd [eax+10],xmm0 //... jmp return //... someSymbol: dq (double)10 //...