Disassemble-X86

 view release on metacpan or  search on metacpan

X86/MemRegion.pm  view on Meta::CPAN

package Disassemble::X86::MemRegion;

use 5.006;
use strict;
use warnings;
use integer;

sub new {
  my ($class, %args) = @_;
  my $self = bless { } => $class;
  my $mem = $args{mem};
  defined $mem or $mem = "";
  $self->{mem}   = $mem;
  $self->{len}   = length($mem);
  $self->{start} = $args{start} || 0;
  $self->{end}   = $self->{start} + $self->{len};
  return $self;
} # new

sub mem   { $_[0]->{mem}   }
sub start { $_[0]->{start} }
sub end   { $_[0]->{end}   }

sub contains {
  my ($self, $addr) = @_;
  return $addr >= $self->{start} && $addr < $self->{end};
} # contains

sub get_byte {
  my ($self, $pos) = @_;
  $pos -= $self->{start};
  return undef if $pos < 0 || $pos >= $self->{len};
  return ord substr($self->{mem}, $pos, 1);
} # get_byte

sub get_word {
  my ($self, $pos) = @_;
  $pos -= $self->{start};
  return undef if $pos < 0 || $pos+2 > $self->{len};
  return unpack "v", substr($self->{mem}, $pos, 2);
} # get_word

sub get_long {
  my ($self, $pos) = @_;
  $pos -= $self->{start};
  return undef if $pos < 0 || $pos+4 > $self->{len};
  return unpack "V", substr($self->{mem}, $pos, 4);
} # get_long

sub get_string {
  my ($self, $pos, $len) = @_;
  $pos -= $self->{start};
  return undef if $pos < 0 || $pos > $self->{len};
  $len ||= "*";
  return unpack "x${pos}Z$len", $self->{mem};
} # get_string

sub get_string_lenbyte {
  my ($self, $pos) = @_;
  $pos -= $self->{start};
  my $mem_len = $self->{len};
  return undef if $pos < 0 || $pos >= $mem_len;
  my $str_len = ord substr($self->{mem}, $pos, 1);
  return undef if $pos+$str_len >= $mem_len;
  return substr($self->{mem}, $pos+1, $str_len);
} # get_string_lenbyte

sub get_string_lenword {
  my ($self, $pos) = @_;
  $pos -= $self->{start};

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.744 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )