Nasm-X86
view release on metacpan or search on metacpan
lib/Nasm/X86.pm view on Meta::CPAN
{"l".++$Labels; # Generate a label
}
sub SetLabel($) # Set a label in the code section
{my ($l) = @_; # Label
push @text, <<END; # Define bytes
$l:
END
}
sub Ds(@) # Layout bytes in memory and return their label
{my (@d) = @_; # Data to be laid out
my $d = join '', @_;
$d =~ s(') (\')gs;
my $l = Label;
push @data, <<END; # Define bytes
$l: db '$d';
END
$l # Return label
}
sub Rs(@) # Layout bytes in read only memory and return their label
{my (@d) = @_; # Data to be laid out
my $d = join '', @_;
$d =~ s(') (\')gs;
return $_ if $_ = $rodatas{$d}; # Data already exists so return it
my $l = Label;
$rodatas{$d} = $l; # Record label
push @rodata, <<END; # Define bytes
$l: db '$d',0;
END
$l # Return label
lib/Nasm/X86.pm view on Meta::CPAN
sub Dbwdq($@) #P Layout data
{my ($s, @d) = @_; # Element size, data to be laid out
my $d = join ', ', @d;
my $l = Label;
push @data, <<END;
$l: d$s $d
END
$l # Return label
}
sub Db(@) # Layout bytes in the data segment and return their label
{my (@bytes) = @_; # Bytes to layout
Dbwdq 'b', @_;
}
sub Dw(@) # Layout words in the data segment and return their label
{my (@words) = @_; # Words to layout
Dbwdq 'w', @_;
}
sub Dd(@) # Layout double words in the data segment and return their label
{my (@dwords) = @_; # Double words to layout
Dbwdq 'd', @_;
}
sub Dq(@) # Layout quad words in the data segment and return their label
{my (@qwords) = @_; # Quad words to layout
Dbwdq 'q', @_;
}
sub Rbwdq($@) #P Layout data
{my ($s, @d) = @_; # Element size, data to be laid out
my $d = join ', ', @d; # Data to be laid out
return $_ if $_ = $rodata{$d}; # Data already exists so return it
my $l = Label; # New data - create a label
push @rodata, <<END; # Save in read only data
$l: d$s $d
END
$rodata{$d} = $l; # Record label
$l # Return label
}
sub Rb(@) # Layout bytes in the data segment and return their label
{my (@bytes) = @_; # Bytes to layout
Rbwdq 'b', @_;
}
sub Rw(@) # Layout words in the data segment and return their label
{my (@words) = @_; # Words to layout
Rbwdq 'w', @_;
}
sub Rd(@) # Layout double words in the data segment and return their label
{my (@dwords) = @_; # Double words to layout
Rbwdq 'd', @_;
}
sub Rq(@) # Layout quad words in the data segment and return their label
{my (@qwords) = @_; # Quad words to layout
Rbwdq 'q', @_;
}
#D1 Registers # Operations on registers
sub SaveFirstFour() # Save the first 4 parameter registers
{Push rax;
Push rdi;
Push rsi;
lib/Nasm/X86.pm view on Meta::CPAN
@_ == 1 or confess;
for my $r(@registers)
{my $size = RegisterSize $r;
Xor $r, $r if $size == 8;
Vpxorq $r, $r if $size > 8;
}
}
#D1 Structured Programming # Structured programming constructs
sub If(&;&) # If
{my ($then, $else) = @_; # Then - required , else - optional
@_ >= 1 or confess;
if (@_ == 1) # No else
{Comment "if then";
my $end = Label;
Jz $end;
&$then;
SetLabel $end;
}
else # With else
( run in 2.169 seconds using v1.01-cache-2.11-cpan-4ab04211f4c )