x86_64 assembler translator update.
This commit is contained in:
parent
57ee007035
commit
5d0d60e2f5
@ -42,6 +42,19 @@
|
|||||||
# 6. Don't use [or hand-code with .byte] "rep ret." "ret" mnemonic is
|
# 6. Don't use [or hand-code with .byte] "rep ret." "ret" mnemonic is
|
||||||
# required to identify the spots, where to inject Win64 epilogue!
|
# required to identify the spots, where to inject Win64 epilogue!
|
||||||
# But on the pros, it's then prefixed with rep automatically:-)
|
# But on the pros, it's then prefixed with rep automatically:-)
|
||||||
|
# 7. Due to MASM limitations [and certain general counter-intuitivity
|
||||||
|
# of ip-relative addressing] generation of position-independent
|
||||||
|
# code is assisted by synthetic directive, .picmeup, which puts
|
||||||
|
# address of the *next* instruction into target register.
|
||||||
|
#
|
||||||
|
# Example 1:
|
||||||
|
# .picmeup %rax
|
||||||
|
# lea .Label-.(%rax),%rax
|
||||||
|
# Example 2:
|
||||||
|
# .picmeup %rcx
|
||||||
|
# .Lpic_point:
|
||||||
|
# ...
|
||||||
|
# lea .Label-.Lpic_point(%rcx),%rbp
|
||||||
|
|
||||||
my $output = shift;
|
my $output = shift;
|
||||||
open STDOUT,">$output" || die "can't open $output: $!";
|
open STDOUT,">$output" || die "can't open $output: $!";
|
||||||
@ -113,14 +126,18 @@ my $current_function;
|
|||||||
$self->{value} = $1;
|
$self->{value} = $1;
|
||||||
$ret = $self;
|
$ret = $self;
|
||||||
$line = substr($line,@+[0]); $line =~ s/^\s+//;
|
$line = substr($line,@+[0]); $line =~ s/^\s+//;
|
||||||
|
|
||||||
$self->{value} = oct($self->{value}) if ($self->{value} =~ /^0/);
|
|
||||||
}
|
}
|
||||||
$ret;
|
$ret;
|
||||||
}
|
}
|
||||||
sub out {
|
sub out {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
sprintf $masm?"0%xh":"\$0x%x",$self->{value};
|
|
||||||
|
if (!$masm) {
|
||||||
|
sprintf "\$%s",$self->{value};
|
||||||
|
} else {
|
||||||
|
$self->{value} =~ s/0x([0-9a-f]+)/0$1h/ig;
|
||||||
|
sprintf "%s",$self->{value};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{ package ea; # pick up effective addresses: expr(%reg,%reg,scale)
|
{ package ea; # pick up effective addresses: expr(%reg,%reg,scale)
|
||||||
@ -156,8 +173,7 @@ my $current_function;
|
|||||||
sprintf "%s(%%%s,%%%s,%d)",
|
sprintf "%s(%%%s,%%%s,%d)",
|
||||||
$self->{label},$self->{base},
|
$self->{label},$self->{base},
|
||||||
$self->{index},$self->{scale};
|
$self->{index},$self->{scale};
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
sprintf "%s(%%%s)", $self->{label},$self->{base};
|
sprintf "%s(%%%s)", $self->{label},$self->{base};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -172,8 +188,7 @@ my $current_function;
|
|||||||
$self->{label},
|
$self->{label},
|
||||||
$self->{index},$self->{scale},
|
$self->{index},$self->{scale},
|
||||||
$self->{base};
|
$self->{base};
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
sprintf "%s PTR %s[%s]",$szmap{$sz},
|
sprintf "%s PTR %s[%s]",$szmap{$sz},
|
||||||
$self->{label},$self->{base};
|
$self->{label},$self->{base};
|
||||||
}
|
}
|
||||||
@ -281,13 +296,26 @@ my $current_function;
|
|||||||
local *line = shift;
|
local *line = shift;
|
||||||
undef $ret;
|
undef $ret;
|
||||||
my $dir;
|
my $dir;
|
||||||
|
my %opcode = # lea 2f-1f(%rip),%dst; 1: nop; 2:
|
||||||
|
( "%rax"=>0x01058d48, "%rcx"=>0x010d8d48,
|
||||||
|
"%rdx"=>0x01158d48, "%rbx"=>0x011d8d48,
|
||||||
|
"%rsp"=>0x01258d48, "%rbp"=>0x012d8d48,
|
||||||
|
"%rsi"=>0x01358d48, "%rdi"=>0x013d8d48,
|
||||||
|
"%r8" =>0x01058d4c, "%r9" =>0x010d8d4c,
|
||||||
|
"%r10"=>0x01158d4c, "%r11"=>0x011d8d4c,
|
||||||
|
"%r12"=>0x01258d4c, "%r13"=>0x012d8d4c,
|
||||||
|
"%r14"=>0x01358d4c, "%r15"=>0x013d8d4c );
|
||||||
|
|
||||||
if ($line =~ /^\s*(\.\w+)/) {
|
if ($line =~ /^\s*(\.\w+)/) {
|
||||||
if (!$masm) {
|
if (!$masm) {
|
||||||
$self->{value} = $1;
|
$self->{value} = $1;
|
||||||
$line =~ s/\@abi\-omnipotent/\@function/;
|
$line =~ s/\@abi\-omnipotent/\@function/;
|
||||||
$line =~ s/\@function.*/\@function/;
|
$line =~ s/\@function.*/\@function/;
|
||||||
|
if ($line =~ /\.picmeup\s+(%r[\w]+)/i) {
|
||||||
|
$self->{value} = sprintf "\t.long\t0x%x,0x90000000",$opcode{$1};
|
||||||
|
} else {
|
||||||
$self->{value} = $line;
|
$self->{value} = $line;
|
||||||
|
}
|
||||||
$line = "";
|
$line = "";
|
||||||
return $self;
|
return $self;
|
||||||
}
|
}
|
||||||
@ -308,20 +336,19 @@ my $current_function;
|
|||||||
};
|
};
|
||||||
/\.globl/ && do { $self->{value} = "PUBLIC\t".$line; last; };
|
/\.globl/ && do { $self->{value} = "PUBLIC\t".$line; last; };
|
||||||
/\.type/ && do { ($sym,$type,$narg) = split(',',$line);
|
/\.type/ && do { ($sym,$type,$narg) = split(',',$line);
|
||||||
if ($type eq "\@function")
|
if ($type eq "\@function") {
|
||||||
{ undef $current_function;
|
undef $current_function;
|
||||||
$current_function->{name} = $sym;
|
$current_function->{name} = $sym;
|
||||||
$current_function->{abi} = "svr4";
|
$current_function->{abi} = "svr4";
|
||||||
$current_function->{narg} = $narg;
|
$current_function->{narg} = $narg;
|
||||||
}
|
} elsif ($type eq "\@abi-omnipotent") {
|
||||||
elsif ($type eq "\@abi-omnipotent")
|
undef $current_function;
|
||||||
{ undef $current_function;
|
|
||||||
$current_function->{name} = $sym;
|
$current_function->{name} = $sym;
|
||||||
}
|
}
|
||||||
last;
|
last;
|
||||||
};
|
};
|
||||||
/\.size/ && do { if (defined($current_function))
|
/\.size/ && do { if (defined($current_function)) {
|
||||||
{ $self->{value}="$current_function->{name}\tENDP";
|
$self->{value}="$current_function->{name}\tENDP";
|
||||||
undef $current_function;
|
undef $current_function;
|
||||||
}
|
}
|
||||||
last;
|
last;
|
||||||
@ -338,6 +365,9 @@ my $current_function;
|
|||||||
$self->{value} .= sprintf"0%Xh",oct($last);
|
$self->{value} .= sprintf"0%Xh",oct($last);
|
||||||
last;
|
last;
|
||||||
};
|
};
|
||||||
|
/\.picmeup/ && do { $self->{value} = sprintf"\tDD\t 0%Xh,090000000h",$opcode{$line};
|
||||||
|
last;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
$line = "";
|
$line = "";
|
||||||
}
|
}
|
||||||
@ -391,13 +421,11 @@ while($line=<>) {
|
|||||||
if (!$masm) {
|
if (!$masm) {
|
||||||
printf "\t%s\t%s,%s", $opcode->out($dst->size()),
|
printf "\t%s\t%s,%s", $opcode->out($dst->size()),
|
||||||
$src->out($sz),$dst->out($sz);
|
$src->out($sz),$dst->out($sz);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
printf "\t%s\t%s,%s", $opcode->out(),
|
printf "\t%s\t%s,%s", $opcode->out(),
|
||||||
$dst->out($sz),$src->out($sz);
|
$dst->out($sz),$src->out($sz);
|
||||||
}
|
}
|
||||||
}
|
} elsif (defined($src)) {
|
||||||
elsif (defined($src)) {
|
|
||||||
printf "\t%s\t%s",$opcode->out(),$src->out($sz);
|
printf "\t%s\t%s",$opcode->out(),$src->out($sz);
|
||||||
} else {
|
} else {
|
||||||
printf "\t%s",$opcode->out();
|
printf "\t%s",$opcode->out();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user