RosettaCodeData/Task/Machine-code/Raku/machine-code-2.raku

34 lines
1.1 KiB
Raku

use NativeCall;
constant PROT_READ = 0x1; #
constant PROT_WRITE = 0x2; #
constant PROT_EXEC = 0x4; # from local /usr/include/bits/mman.h
constant MAP_PRIVATE = 0x02; #
constant MAP_ANON = 0x20; #
sub mmap(Pointer $addr, size_t $length, int32 $prot, int32 $flags,
int32 $fd, size_t $offset --> Pointer) is native { * };
sub memcpy(Pointer $dest, Pointer $src, size_t $size --> Pointer) is native {*}
sub munmap(Pointer $addr, size_t $length) is native { * };
sub test (uint8 $a, uint8 $b) {
my $code = CArray[uint8].new(
0x90, 0x90, 0x6A, 0xC, 0xB8, 0x7, 0x0, 0x0, 0x0, 0x48, 0xC1, 0xE0, 0x20,
0x50, 0x8B, 0x44, 0x24, 0x4, 0x3, 0x44, 0x24, 0x8, 0x4C, 0x89, 0xE3, 0x89,
0xC3, 0x48, 0xC1, 0xE3, 0x4, 0x80, 0xCB, 0x2, 0x48, 0x83, 0xC4, 0x10, 0xC3
);
my $buf =
mmap(Pointer, nativesizeof($code), PROT_READ +| PROT_WRITE +| PROT_EXEC,
MAP_PRIVATE +| MAP_ANON, -1, 0);
memcpy($buf, nativecast(Pointer,$code), nativesizeof($code));
my $c; # = ((int (*) (int, int))buf)(a, b);
munmap($buf, nativesizeof($code));
return $c = "Incomplete Attempt";
}
say test 7, 12;