typedef int (*FuncPtr)(); // Create a function: char testFunc[] = { 0x90, // NOP (not really necessary...) 0xB8, 0x10, 0x00, 0x00, 0x00, // MOVL $16,%eax 0xC3 }; // RET int main () { // Make a copy on the heap, OS doesn't like executing the stack: FuncPtr testFuncPtr = (FuncPtr) malloc(7); memmove( (void*) testFuncPtr, testFunc, 7 ); printf("Before function.\n"); int result = (*testFuncPtr)(); printf("Result %d\n", result); system("PAUSE"); return 0; }
Is this possible to do in BMax?
BlitzMax Forums/BlitzMax Programming/Is this possible to do in BMax? Works fine :)
SuperStrict Framework BRL.StandardIO Local testFunc:Byte[]=[$90:Byte,$B8:Byte,$10:Byte,$00:Byte,$00:Byte,$00:Byte,$C3:Byte] Local testFuncPtr:Int()=MemAlloc(testFunc.length) MemMove(testFuncPtr,testFunc,testFunc.length) Print "Before function." Local result:Int=testFuncPtr() Print "Result: "+result
nice :)
how does this:
translate to:
(I don't mean that I don't believe it, I want to know what byte represents what (except $10 which I can work out for myself)).
how does this:
0xB8, 0x10, 0x00, 0x00, 0x00,
translate to:
// MOVL $16,%eax
(I don't mean that I don't believe it, I want to know what byte represents what (except $10 which I can work out for myself)).
Nice Foody, that was surprisingly painless.
@Perturbatio
"0xB8, 0x10, 0x00, 0x00, 0x00" is how the PC sees "MOVL $16,%eax". Like in the good old 8-bit days, people used to write entire games like that! :)
If you do a search for something like "x86 instruction set" in Google, you should be able to find a list of what bytes mean what.
"0xB8, 0x10, 0x00, 0x00, 0x00" is how the PC sees "MOVL $16,%eax". Like in the good old 8-bit days, people used to write entire games like that! :)
If you do a search for something like "x86 instruction set" in Google, you should be able to find a list of what bytes mean what.
yep, I presumed 0xB8 is MOV and 0x10 is the value 16, but do you need 0x00 three times to refer to the EAX register?
0xB8 is probably the whole MOV EAX, and the 3 '00s' are probably the 3 empty bytes of a 32 bit '16'
ahhh, that makes more sense :)