Is this possible to do in BMax?

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

GW(Posted 2007) [#1]
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;
}



FOODy(Posted 2007) [#2]
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



Perturbatio(Posted 2007) [#3]
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)).


GW(Posted 2007) [#4]
Nice Foody, that was surprisingly painless.


Big&(Posted 2007) [#5]
@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.


Perturbatio(Posted 2007) [#6]
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?


Who was John Galt?(Posted 2007) [#7]
0xB8 is probably the whole MOV EAX, and the 3 '00s' are probably the 3 empty bytes of a 32 bit '16'


Perturbatio(Posted 2007) [#8]
ahhh, that makes more sense :)