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__ |