File Coverage

blib/lib/Disassemble/X86/FormatText.pm
Criterion Covered Total %
statement 38 48 79.1
branch 22 30 73.3
condition 4 7 57.1
subroutine 5 5 100.0
pod 1 2 50.0
total 70 92 76.0


line stmt bran cond sub pod time code
1             package Disassemble::X86::FormatText;
2              
3 1     1   31 use 5.006;
  1         3  
  1         41  
4 1     1   5 use strict;
  1         2  
  1         35  
5 1     1   5 use warnings;
  1         1  
  1         830  
6              
7             my %size_tag = (
8             8 => "byte",
9             16 => "word",
10             32 => "dword",
11             64 => "qword",
12             80 => "tbyte",
13             128 => "dqword",
14             );
15              
16             my %far_size_tag = (
17             32 => "far",
18             48 => "far32",
19             );
20              
21             sub format_instr {
22 462     462 1 1481 my ($self, $tree) = @_;
23 462         949 my $op = $tree->{op};
24 462         681 my $arg = $tree->{arg};
25              
26 462 100 66     14116 if ($tree->{prefix}) {
    50          
    100          
27 8         28 $arg = $self->format_instr($arg->[0]);
28 8 50       36 $arg .= " ." unless $arg =~ / /;
29 8         64 return "$op $arg";
30             }
31             elsif ($op eq "push") {
32 0         0 $arg = $arg->[0];
33 0 0       0 if ($arg->{op} eq "lit") {
34 0         0 my $size = $arg->{size};
35 0 0       0 $size = $size_tag{$size} if $size;
36 0   0     0 $size ||= "";
37 0         0 $arg = format_arg($arg);
38 0         0 return "push $size($arg)";
39             }
40             else {
41 0         0 $arg = format_arg($arg);
42 0         0 return "push $arg";
43             }
44             }
45             elsif ($arg && @$arg) {
46 344         1043 $arg = join ",", map(format_arg($_), @$arg);
47 344         3548 return "$op $arg";
48             }
49             else {
50 110         809 return $op;
51             }
52             } # format_instr
53              
54             sub format_arg {
55 1308     1308 0 1983 my ($tree) = @_;
56 1308         2222 my $op = $tree->{op};
57 1308         1735 my $arg = $tree->{arg};
58              
59 1308 100       5678 if ($op eq "reg") {
    100          
    100          
    100          
    100          
    100          
    50          
60 634         2285 return $arg->[0];
61             }
62             elsif ($op eq "lit") {
63 234         1942 return sprintf "0x%x", $arg->[0];
64             }
65             elsif ($op eq "farlit") {
66 4         28 return sprintf "0x%x:0x%x", @$arg;
67             }
68             elsif ($op eq "mem") {
69 220         346 my $size = $tree->{size};
70 220 100 100     1430 my $tag = !$size ? ""
71             : ($tree->{far} ? $far_size_tag{$size} : $size_tag{$size}) || "";
72 220         643 $arg = format_arg($arg->[0]);
73 220         1035 return "$tag\[$arg]";
74             }
75             elsif ($op eq "seg") {
76 70         167 my $seg = format_arg($arg->[0]);
77 70         291 my $off = format_arg($arg->[1]);
78 70         217 return "$seg:$off";
79             }
80             elsif ($op eq "+") {
81 132         347 return join "+", map(format_arg($_), @$arg);
82             }
83             elsif ($op eq "*") {
84 14         51 my $lhs = format_arg($arg->[0]);
85 14         103 my $rhs = $arg->[1];
86 14 50       135 $rhs = ($rhs->{op} eq "lit") ? $rhs->{arg}[0] : format_arg($rhs);
87 14         69 return "$lhs*$rhs";
88             }
89 0           return $op;
90             } # format_arg
91              
92             1 # end FormatText.pm
93             __END__