Looking for help!
Name
Nasm::X86 - Generate Nasm assembler code
Synopsis
Write and run some assembler code to start a child process and wait for it, printing out the process identifiers of each process involved:
Start; # Start the program
Fork; # Fork
Test rax,rax;
If # Parent
{Mov rbx, rax;
WaitPid;
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
GetPid; # Pid of parent as seen in parent
Mov rcx,rax;
PrintOutRegisterInHex rcx;
}
sub # Child
{Mov r8,rax;
PrintOutRegisterInHex r8;
GetPid; # Child pid as seen in child
Mov r9,rax;
PrintOutRegisterInHex r9;
GetPPid; # Parent pid as seen in child
Mov r10,rax;
PrintOutRegisterInHex r10;
};
Exit; # Return to operating system
my $r = assemble();
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
Get the size of this file:
Start; # Start the program
my $f = Rs($0); # File to stat
StatSize($f); # Stat the file
PrintOutRegisterInHex rax;
Exit; # Return to operating system
my $r = assemble() =~ s( ) ()gsr;
if ($r =~ m(rax:([0-9a-f]{16}))is) # Compare file size obtained with that from fileSize()
{is_deeply $1, sprintf("%016X", fileSize($0));
}
Description
Generate Nasm assembler code
Version "20210404".
The following sections describe the methods in each functional area of this module. For an alphabetic listing of all methods by name see Index.
Generate Network Assembler Code
Generate assembler code that can be assembled with Nasm
Start()
Initialize the assembler
Example:
Start; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutString "Hello World";
Exit;
ok assemble =~ m(Hello World);
Ds(@d)
Layout bytes in memory and return their label
Parameter Description
1 @d Data to be laid out
Example:
Start;
my $q = Rs('a'..'z');
my $d = Ds('0'x64); # Output area # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Vmovdqu32(xmm0, "[$q]"); # Load
Vprolq (xmm0, xmm0, 32); # Rotate double words in quad words
Vmovdqu32("[$d]", xmm0); # Save
PrintOutString($d, 16);
Exit;
ok assemble() =~ m(efghabcdmnopijkl)s;
Rs(@d)
Layout bytes in read only memory and return their label
Parameter Description
1 @d Data to be laid out
Example:
Start;
Comment "Print a string from memory";
my $s = "Hello World";
my $m = Rs($s); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Mov rsi, $m;
PrintOutString rsi, length($s);
Exit;
ok assemble =~ m(Hello World);
Dbwdq($s, @d)
Layout data
Parameter Description
1 $s Element size
2 @d Data to be laid out
Db(@bytes)
Layout bytes in the data segment and return their label
Parameter Description
1 @bytes Bytes to layout
Dw(@words)
Layout words in the data segment and return their label
Parameter Description
1 @words Words to layout
Dd(@dwords)
Layout double words in the data segment and return their label
Parameter Description
1 @dwords Double words to layout
Dq(@qwords)
Layout quad words in the data segment and return their label
Parameter Description
1 @qwords Quad words to layout
Rbwdq($s, @d)
Layout data
Parameter Description
1 $s Element size
2 @d Data to be laid out
Rb(@bytes)
Layout bytes in the data segment and return their label
Parameter Description
1 @bytes Bytes to layout
Rw(@words)
Layout words in the data segment and return their label
Parameter Description
1 @words Words to layout
Rd(@dwords)
Layout double words in the data segment and return their label
Parameter Description
1 @dwords Double words to layout
Rq(@qwords)
Layout quad words in the data segment and return their label
Parameter Description
1 @qwords Quad words to layout
Comment(@comment)
Insert a comment into the assembly code
Parameter Description
1 @comment Text of comment
Example:
Start;
Comment "Print a string from memory"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
my $s = "Hello World";
my $m = Rs($s);
Mov rsi, $m;
PrintOutString rsi, length($s);
Exit;
ok assemble =~ m(Hello World);
Exit($c)
Exit with the specified return code or zero if no return code supplied
Parameter Description
1 $c Return code
Example:
Start;
PrintOutString "Hello World";
Exit; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
ok assemble =~ m(Hello World);
SaveFirstFour()
Save the first 4 parameter registers
RestoreFirstFour()
Restore the first 4 parameter registers
RestoreFirstFourExceptRax()
Restore the first 4 parameter registers except rax so it can return its value
SaveFirstSeven()
Save the first 7 parameter registers
RestoreFirstSeven()
Restore the first 7 parameter registers
RestoreFirstSevenExceptRax()
Restore the first 7 parameter registers except rax which is being used to return the result
Lea($target, $source)
Load effective address
Parameter Description
1 $target Target
2 $source Source
Example:
Start;
my $q = Rs('abababab');
Mov(rax, 1);
Mov(rbx, 2);
Mov(rcx, 3);
Mov(rdx, 4);
Mov(r8, 5);
Lea r9, "[rax+rbx]"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegistersInHex;
Exit;
ok assemble() =~ m(r8: 0000 0000 0000 0005.*r9: 0000 0000 0000 0003.*rax: 0000 0000 0000 0001)s;
Mov($target, $source)
Move data
Parameter Description
1 $target Target
2 $source Source
Example:
Start;
Comment "Print a string from memory";
my $s = "Hello World";
my $m = Rs($s);
Mov rsi, $m; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutString rsi, length($s);
Exit;
ok assemble =~ m(Hello World);
PushR(@r)
Push registers onto the stack
Parameter Description
1 @r Register
PopR(@r)
Pop registers in reverse order from the stack so the same parameter list can be shared with pushR
Parameter Description
1 @r Register
Example:
Start;
my $q = Rs(('a'..'p')x4);
my $d = Ds('0'x128);
Vmovdqu32(zmm0, "[$q]");
Vprolq (zmm0, zmm0, 32);
Vmovdqu32("[$d]", zmm0);
PrintOutString($d, 64);
Sub rsp, 64;
Vmovdqu64 "[rsp]", zmm0;
PopR rax; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRaxInHex;
Exit;
ok assemble() =~ m(efghabcdmnopijklefghabcdmnopijklefghabcdmnopijklefghabcdmnopijkl)s;
Add($target, $source)
Add
Parameter Description
1 $target Target
2 $source Source
Sub($target, $source)
Subtract
Parameter Description
1 $target Target
2 $source Source
PrintOutNl()
Write a new line
Example:
Start;
Comment "Print a string from memory";
my $s = "Hello World";
my $m = Rs($s);
Mov rsi, $m;
PrintOutString rsi, length($s);
Exit;
ok assemble =~ m(Hello World);
PrintOutString($string, $length)
One: Write a constant string to sysout. Two write the bytes addressed for the specified length to sysout
Parameter Description
1 $string String
2 $length Length
Example:
Start;
PrintOutString "Hello World"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Exit;
ok assemble =~ m(Hello World);
PrintOutRaxInHex()
Write the content of register rax to stderr in hexadecimal in big endian notation
Example:
Start;
my $q = Rs('abababab');
Mov(rax, "[$q]");
PrintOutString "rax: ";
PrintOutRaxInHex; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutNl;
Xor rax, rax;
PrintOutString "rax: ";
PrintOutRaxInHex; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutNl;
Exit;
ok assemble() =~ m(rax: 6261 6261 6261 6261.*rax: 0000 0000 0000 0000)s;
PrintOutRegisterInHex($r)
Print any register as a hex string
Parameter Description
1 $r Name of the register to print
Example:
Start;
my $q = Rs(('a'..'p')x4);
Mov r8,"[$q]";
PrintOutRegisterInHex r8; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Exit;
ok assemble() =~ m(r8: 6867 6665 6463 6261)s;
PrintOutRegistersInHex()
Print the general purpose registers in hex
Example:
Start;
my $q = Rs('abababab');
Mov(rax, 1);
Mov(rbx, 2);
Mov(rcx, 3);
Mov(rdx, 4);
Mov(r8, 5);
Lea r9, "[rax+rbx]";
PrintOutRegistersInHex; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Exit;
ok assemble() =~ m(r8: 0000 0000 0000 0005.*r9: 0000 0000 0000 0003.*rax: 0000 0000 0000 0001)s;
Xor($t, $s)
Xor
Parameter Description
1 $t Target
2 $s Source
Example:
Start;
my $q = Rs('abababab');
Mov(rax, "[$q]");
PrintOutString "rax: ";
PrintOutRaxInHex;
PrintOutNl;
Xor rax, rax; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutString "rax: ";
PrintOutRaxInHex;
PrintOutNl;
Exit;
ok assemble() =~ m(rax: 6261 6261 6261 6261.*rax: 0000 0000 0000 0000)s;
Test($t, $s)
Test
Parameter Description
1 $t Target
2 $s Source
Vmovdqu8($r, $m)
Move memory in 8 bit blocks to an x/y/zmm* register
Parameter Description
1 $r Register
2 $m Memory
Example:
Start;
my $q = Rs('a'..'p');
Vmovdqu8 xmm0, "[$q]"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegisterInHex xmm0;
Exit;
ok assemble() =~ m(xmm0: 706F 6E6D 6C6B 6A69 6867 6665 6463 6261)s;
Vmovdqu32($r, $m)
Move memory in 32 bit blocks to an x/y/zmm* register
Parameter Description
1 $r Register
2 $m Memory
Example:
Start;
my $q = Rs('a'..'z');
my $d = Ds('0'x64); # Output area
Vmovdqu32(xmm0, "[$q]"); # Load # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Vprolq (xmm0, xmm0, 32); # Rotate double words in quad words
Vmovdqu32("[$d]", xmm0); # Save # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutString($d, 16);
Exit;
ok assemble() =~ m(efghabcdmnopijkl)s;
Vmovdqu64($r, $m)
Move memory in 64 bit blocks to an x/y/zmm* register
Parameter Description
1 $r Register
2 $m Memory
Example:
Start;
my $q = Rs(('a'..'p')x4);
my $d = Ds('0'x128);
Vmovdqu32(zmm0, "[$q]");
Vprolq (zmm0, zmm0, 32);
Vmovdqu32("[$d]", zmm0);
PrintOutString($d, 64);
Sub rsp, 64;
Vmovdqu64 "[rsp]", zmm0; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PopR rax;
PrintOutRaxInHex;
Exit;
ok assemble() =~ m(efghabcdmnopijklefghabcdmnopijklefghabcdmnopijklefghabcdmnopijkl)s;
Vprolq($r, $m, $bits)
Rotate left within quad word indicated number of bits
Parameter Description
1 $r Register
2 $m Memory
3 $bits Number of bits to rotate
Example:
Start;
my $q = Rs('a'..'z');
my $d = Ds('0'x64); # Output area
Vmovdqu32(xmm0, "[$q]"); # Load
Vprolq (xmm0, xmm0, 32); # Rotate double words in quad words # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Vmovdqu32("[$d]", xmm0); # Save
PrintOutString($d, 16);
Exit;
ok assemble() =~ m(efghabcdmnopijkl)s;
allocateMemory($s)
Allocate memory via mmap
Parameter Description
1 $s Amount of memory to allocate
Example:
Start;
my $N = 2048;
my $n = Rq($N);
my $q = Rs('a'..'p');
allocateMemory "[$n]"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegisterInHex rax;
Vmovdqu8 xmm0, "[$q]";
Vmovdqu8 "[rax]", xmm0;
PrintOutString rax,16;
PrintOutNl;
Mov rbx, rax;
freeMemory rbx, "[$n]";
PrintOutRegisterInHex rax;
Vmovdqu8 "[rbx]", xmm0;
Exit;
ok assemble() =~ m(abcdefghijklmnop)s;
freeMemory($a, $l)
Free memory via mmap
Parameter Description
1 $a Address of memory to free
2 $l Length of memory to free
Example:
Start;
my $N = 2048;
my $n = Rq($N);
my $q = Rs('a'..'p');
allocateMemory "[$n]";
PrintOutRegisterInHex rax;
Vmovdqu8 xmm0, "[$q]";
Vmovdqu8 "[rax]", xmm0;
PrintOutString rax,16;
PrintOutNl;
Mov rbx, rax;
freeMemory rbx, "[$n]"; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegisterInHex rax;
Vmovdqu8 "[rbx]", xmm0;
Exit;
ok assemble() =~ m(abcdefghijklmnop)s;
Fork()
Fork
Example:
Start; # Start the program
Fork; # Fork # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Test rax,rax;
If # Parent
{Mov rbx, rax;
WaitPid;
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
GetPid; # Pid of parent as seen in parent
Mov rcx,rax;
PrintOutRegisterInHex rcx;
}
sub # Child
{Mov r8,rax;
PrintOutRegisterInHex r8;
GetPid; # Child pid as seen in child
Mov r9,rax;
PrintOutRegisterInHex r9;
GetPPid; # Parent pid as seen in child
Mov r10,rax;
PrintOutRegisterInHex r10;
};
Exit; # Return to operating system
my $r = assemble();
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
if ($r =~ m(r8:( 0000){4}.*r9:(.*)\s{5,}r10:(.*)\s{5,}rax:(.*)\s{5,}rbx:(.*)\s{5,}rcx:(.*)\s{2,})s)
{ok $2 eq $4;
ok $2 eq $5;
ok $3 eq $6;
ok $2 gt $6;
}
Start; # Start the program
GetUid; # Userid
PrintOutRegisterInHex rax;
Exit; # Return to operating system
my $r = assemble();
ok $r =~ m(rax:( 0000){3});
GetPid()
Get process identifier
Example:
Start; # Start the program
Fork; # Fork
Test rax,rax;
If # Parent
{Mov rbx, rax;
WaitPid;
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
GetPid; # Pid of parent as seen in parent # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Mov rcx,rax;
PrintOutRegisterInHex rcx;
}
sub # Child
{Mov r8,rax;
PrintOutRegisterInHex r8;
GetPid; # Child pid as seen in child # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Mov r9,rax;
PrintOutRegisterInHex r9;
GetPPid; # Parent pid as seen in child
Mov r10,rax;
PrintOutRegisterInHex r10;
};
Exit; # Return to operating system
my $r = assemble();
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
if ($r =~ m(r8:( 0000){4}.*r9:(.*)\s{5,}r10:(.*)\s{5,}rax:(.*)\s{5,}rbx:(.*)\s{5,}rcx:(.*)\s{2,})s)
{ok $2 eq $4;
ok $2 eq $5;
ok $3 eq $6;
ok $2 gt $6;
}
Start; # Start the program
GetUid; # Userid
PrintOutRegisterInHex rax;
Exit; # Return to operating system
my $r = assemble();
ok $r =~ m(rax:( 0000){3});
GetPPid()
Get parent process identifier
Example:
Start; # Start the program
Fork; # Fork
Test rax,rax;
If # Parent
{Mov rbx, rax;
WaitPid;
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
GetPid; # Pid of parent as seen in parent
Mov rcx,rax;
PrintOutRegisterInHex rcx;
}
sub # Child
{Mov r8,rax;
PrintOutRegisterInHex r8;
GetPid; # Child pid as seen in child
Mov r9,rax;
PrintOutRegisterInHex r9;
GetPPid; # Parent pid as seen in child # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Mov r10,rax;
PrintOutRegisterInHex r10;
};
Exit; # Return to operating system
my $r = assemble();
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
if ($r =~ m(r8:( 0000){4}.*r9:(.*)\s{5,}r10:(.*)\s{5,}rax:(.*)\s{5,}rbx:(.*)\s{5,}rcx:(.*)\s{2,})s)
{ok $2 eq $4;
ok $2 eq $5;
ok $3 eq $6;
ok $2 gt $6;
}
Start; # Start the program
GetUid; # Userid
PrintOutRegisterInHex rax;
Exit; # Return to operating system
my $r = assemble();
ok $r =~ m(rax:( 0000){3});
GetUid()
Get userid of current process
WaitPid()
Wait for the pid in rax to complete
Example:
Start; # Start the program
Fork; # Fork
Test rax,rax;
If # Parent
{Mov rbx, rax;
WaitPid; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegisterInHex rax;
PrintOutRegisterInHex rbx;
GetPid; # Pid of parent as seen in parent
Mov rcx,rax;
PrintOutRegisterInHex rcx;
}
sub # Child
{Mov r8,rax;
PrintOutRegisterInHex r8;
GetPid; # Child pid as seen in child
Mov r9,rax;
PrintOutRegisterInHex r9;
GetPPid; # Parent pid as seen in child
Mov r10,rax;
PrintOutRegisterInHex r10;
};
Exit; # Return to operating system
my $r = assemble();
# r8: 0000 0000 0000 0000 #1 Return from fork as seen by child
# r9: 0000 0000 0003 0C63 #2 Pid of child
# r10: 0000 0000 0003 0C60 #3 Pid of parent from child
# rax: 0000 0000 0003 0C63 #4 Return from fork as seen by parent
# rbx: 0000 0000 0003 0C63 #5 Wait for child pid result
# rcx: 0000 0000 0003 0C60 #6 Pid of parent
if ($r =~ m(r8:( 0000){4}.*r9:(.*)\s{5,}r10:(.*)\s{5,}rax:(.*)\s{5,}rbx:(.*)\s{5,}rcx:(.*)\s{2,})s)
{ok $2 eq $4;
ok $2 eq $5;
ok $3 eq $6;
ok $2 gt $6;
}
Start; # Start the program
GetUid; # Userid
PrintOutRegisterInHex rax;
Exit; # Return to operating system
my $r = assemble();
ok $r =~ m(rax:( 0000){3});
readTimeStampCounter()
Read the time stamp counter
Example:
Start;
for(1..10)
{readTimeStampCounter; # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
PrintOutRegisterInHex rax;
}
Exit;
my @s = split /
/, assemble();
my @S = sort @s;
is_deeply \@s, \@S;
StatSize($file)
Stat a file to get its size in rax
Parameter Description
1 $file File
If($then, $else)
If
Parameter Description
1 $then Then - required
2 $else Else - optional
Example:
Start;
Mov rax, 0;
Test rax,rax;
If # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
{PrintOutRegisterInHex rax;
} sub
{PrintOutRegisterInHex rbx;
};
Mov rax, 1;
Test rax,rax;
If # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
{PrintOutRegisterInHex rcx;
} sub
{PrintOutRegisterInHex rdx;
};
Exit;
ok assemble() =~ m(rbx.*rcx)s;
assemble(%options)
Assemble the generated code
Parameter Description
1 %options Options
Example:
Start;
PrintOutString "Hello World";
Exit;
ok assemble =~ m(Hello World); # 𝗘𝘅𝗮𝗺𝗽𝗹𝗲
Private Methods
label()
Create a unique label
Index
1 Add - Add
2 allocateMemory - Allocate memory via mmap
3 assemble - Assemble the generated code
4 Comment - Insert a comment into the assembly code
5 Db - Layout bytes in the data segment and return their label
6 Dbwdq - Layout data
7 Dd - Layout double words in the data segment and return their label
8 Dq - Layout quad words in the data segment and return their label
9 Ds - Layout bytes in memory and return their label
10 Dw - Layout words in the data segment and return their label
11 Exit - Exit with the specified return code or zero if no return code supplied
12 Fork - Fork
13 freeMemory - Free memory via mmap
14 GetPid - Get process identifier
15 GetPPid - Get parent process identifier
16 GetUid - Get userid of current process
17 If - If
18 label - Create a unique label
19 Lea - Load effective address
20 Mov - Move data
21 PopR - Pop registers in reverse order from the stack so the same parameter list can be shared with pushR
22 PrintOutNl - Write a new line
23 PrintOutRaxInHex - Write the content of register rax to stderr in hexadecimal in big endian notation
24 PrintOutRegisterInHex - Print any register as a hex string
25 PrintOutRegistersInHex - Print the general purpose registers in hex
26 PrintOutString - One: Write a constant string to sysout.
27 PushR - Push registers onto the stack
28 Rb - Layout bytes in the data segment and return their label
29 Rbwdq - Layout data
30 Rd - Layout double words in the data segment and return their label
31 readTimeStampCounter - Read the time stamp counter
32 RestoreFirstFour - Restore the first 4 parameter registers
33 RestoreFirstFourExceptRax - Restore the first 4 parameter registers except rax so it can return its value
34 RestoreFirstSeven - Restore the first 7 parameter registers
35 RestoreFirstSevenExceptRax - Restore the first 7 parameter registers except rax which is being used to return the result
36 Rq - Layout quad words in the data segment and return their label
37 Rs - Layout bytes in read only memory and return their label
38 Rw - Layout words in the data segment and return their label
39 SaveFirstFour - Save the first 4 parameter registers
40 SaveFirstSeven - Save the first 7 parameter registers
41 Start - Initialize the assembler
42 StatSize - Stat a file to get its size in rax
43 Sub - Subtract
44 Test - Test
45 Vmovdqu32 - Move memory in 32 bit blocks to an x/y/zmm* register
46 Vmovdqu64 - Move memory in 64 bit blocks to an x/y/zmm* register
47 Vmovdqu8 - Move memory in 8 bit blocks to an x/y/zmm* register
48 Vprolq - Rotate left within quad word indicated number of bits
49 WaitPid - Wait for the pid in rax to complete
50 Xor - Xor
Installation
This module is written in 100% Pure Perl and, thus, it is easy to read, comprehend, use, modify and install via cpan:
sudo cpan install Nasm::X86
Author
Copyright
Copyright (c) 2016-2021 Philip R Brenan.
This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.