Is this possible to do in BMax?

BlitzMax Forums/BlitzMax Programming/Is this possible to do in BMax?

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;
}


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:
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.

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 :)