RosettaCodeData/Task/Machine-code/PureBasic/machine-code.purebasic

46 lines
1.3 KiB
Text
Raw Normal View History

2016-12-05 22:15:40 +01:00
CompilerIf #PB_Compiler_Processor <> #PB_Processor_x86
CompilerError "Code requires a 32-bit processor."
CompilerEndIf
; Machine code using the Windows API
2015-02-20 09:02:09 -05:00
Procedure MachineCodeVirtualAlloc(a,b)
*vm = VirtualAlloc_(#Null,?ecode-?scode,#MEM_COMMIT,#PAGE_EXECUTE_READWRITE)
If(*vm)
2016-12-05 22:15:40 +01:00
CopyMemory(?scode, *vm, ?ecode-?scode)
2015-02-20 09:02:09 -05:00
eax_result=CallFunctionFast(*vm,a,b)
VirtualFree_(*vm,0,#MEM_RELEASE)
ProcedureReturn eax_result
EndIf
EndProcedure
2016-12-05 22:15:40 +01:00
rv=MachineCodeVirtualAlloc( 7, 12)
MessageRequester("MachineCodeVirtualAlloc",Str(rv)+Space(50),#PB_MessageRequester_Ok)
2015-02-20 09:02:09 -05:00
#HEAP_CREATE_ENABLE_EXECUTE=$00040000
Procedure MachineCodeHeapCreate(a,b)
hHeap=HeapCreate_(#HEAP_CREATE_ENABLE_EXECUTE,?ecode-?scode,?ecode-?scode)
If(hHeap)
2016-12-05 22:15:40 +01:00
CopyMemory(?scode, hHeap, ?ecode-?scode)
2015-02-20 09:02:09 -05:00
eax_result=CallFunctionFast(hHeap,a,b)
HeapDestroy_(hHeap)
ProcedureReturn eax_result
EndIf
EndProcedure
rv=MachineCodeHeapCreate(7,12)
2016-12-05 22:15:40 +01:00
MessageRequester("MachineCodeHeapCreate",Str(rv)+Space(50),#PB_MessageRequester_Ok)
2015-02-20 09:02:09 -05:00
End
; 8B442404 mov eax,[esp+4]
; 03442408 add eax,[esp+8]
; C20800 ret 8
DataSection
scode:
2016-12-05 22:15:40 +01:00
Data.a $8B,$44,$24,$04,$03,$44,$24,$08,$C2,$08,$00
2015-02-20 09:02:09 -05:00
ecode:
EndDataSection