Support for indirect calls in x86 assembler modules.
This commit is contained in:
parent
a4c886e4c8
commit
3ebf898e88
@ -172,6 +172,7 @@ sub main'popf { &out0("popfd"); $stack-=4; }
|
|||||||
sub main'bswap { &out1("bswap",@_); &using486(); }
|
sub main'bswap { &out1("bswap",@_); &using486(); }
|
||||||
sub main'not { &out1("not",@_); }
|
sub main'not { &out1("not",@_); }
|
||||||
sub main'call { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
|
sub main'call { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
|
||||||
|
sub main'call_ptr { &out1p("call",@_); }
|
||||||
sub main'ret { &out0("ret"); }
|
sub main'ret { &out0("ret"); }
|
||||||
sub main'nop { &out0("nop"); }
|
sub main'nop { &out0("nop"); }
|
||||||
sub main'test { &out2("test",@_); }
|
sub main'test { &out2("test",@_); }
|
||||||
@ -436,7 +437,7 @@ sub out1p
|
|||||||
local($name,$p1)=@_;
|
local($name,$p1)=@_;
|
||||||
local($l,$t);
|
local($l,$t);
|
||||||
|
|
||||||
push(@out,"\t$name\t ".&conv($p1)."\n");
|
push(@out,"\t$name\t".&conv($p1)."\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub main'picmeup
|
sub main'picmeup
|
||||||
@ -452,10 +453,10 @@ sub main'initseg
|
|||||||
local($f)=@_;
|
local($f)=@_;
|
||||||
local($tmp)=<<___;
|
local($tmp)=<<___;
|
||||||
OPTION DOTNAME
|
OPTION DOTNAME
|
||||||
.CRT\$XIU SEGMENT DWORD PUBLIC 'DATA'
|
.CRT\$XCU SEGMENT DWORD PUBLIC 'DATA'
|
||||||
EXTRN _$f:NEAR
|
EXTRN _$f:NEAR
|
||||||
DD _$f
|
DD _$f
|
||||||
.CRT\$XIU ENDS
|
.CRT\$XCU ENDS
|
||||||
___
|
___
|
||||||
push(@out,$tmp);
|
push(@out,$tmp);
|
||||||
}
|
}
|
||||||
|
@ -184,6 +184,7 @@ sub main'popf { &out0("popfd"); $stack-=4; }
|
|||||||
sub main'bswap { &out1("bswap",@_); &using486(); }
|
sub main'bswap { &out1("bswap",@_); &using486(); }
|
||||||
sub main'not { &out1("not",@_); }
|
sub main'not { &out1("not",@_); }
|
||||||
sub main'call { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); }
|
sub main'call { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); }
|
||||||
|
sub main'call_ptr { &out1p("call",@_); }
|
||||||
sub main'ret { &out0("ret"); }
|
sub main'ret { &out0("ret"); }
|
||||||
sub main'nop { &out0("nop"); }
|
sub main'nop { &out0("nop"); }
|
||||||
sub main'test { &out2("test",@_); }
|
sub main'test { &out2("test",@_); }
|
||||||
@ -422,7 +423,7 @@ sub out1p
|
|||||||
my($name,$p1)=@_;
|
my($name,$p1)=@_;
|
||||||
my($l,$t);
|
my($l,$t);
|
||||||
|
|
||||||
push(@out,"\t$name\t ".&conv($p1)."\n");
|
push(@out,"\t$name\t".&conv($p1)."\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub main'picmeup
|
sub main'picmeup
|
||||||
@ -439,7 +440,7 @@ sub main'initseg
|
|||||||
if ($main'win32)
|
if ($main'win32)
|
||||||
{
|
{
|
||||||
local($tmp)=<<___;
|
local($tmp)=<<___;
|
||||||
segment .CRT\$XIU data
|
segment .CRT\$XCU data
|
||||||
extern $under$f
|
extern $under$f
|
||||||
DD $under$f
|
DD $under$f
|
||||||
___
|
___
|
||||||
|
@ -200,6 +200,7 @@ sub main'call { my $pre=$under;
|
|||||||
{ if ($label{$i} eq $_[0]) { $pre=''; last; } }
|
{ if ($label{$i} eq $_[0]) { $pre=''; last; } }
|
||||||
&out1("call",$pre.$_[0]);
|
&out1("call",$pre.$_[0]);
|
||||||
}
|
}
|
||||||
|
sub main'call_ptr { &out1p("call",@_); }
|
||||||
sub main'ret { &out0("ret"); }
|
sub main'ret { &out0("ret"); }
|
||||||
sub main'nop { &out0("nop"); }
|
sub main'nop { &out0("nop"); }
|
||||||
sub main'test { &out2("testl",@_); }
|
sub main'test { &out2("testl",@_); }
|
||||||
|
@ -183,7 +183,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
|
|||||||
&mov ("eax",&DWP(12+$i*4,"ebp"));
|
&mov ("eax",&DWP(12+$i*4,"ebp"));
|
||||||
&mov (&DWP(0+$i*4,"esp"),"eax");
|
&mov (&DWP(0+$i*4,"esp"),"eax");
|
||||||
}
|
}
|
||||||
&call (&DWP(8,"ebp"));# make the call...
|
&call_ptr (&DWP(8,"ebp"));# make the call...
|
||||||
&mov ("esp","ebp"); # ... and just restore the stack pointer
|
&mov ("esp","ebp"); # ... and just restore the stack pointer
|
||||||
# without paying attention to what we called,
|
# without paying attention to what we called,
|
||||||
# (__cdecl *func) or (__stdcall *one).
|
# (__cdecl *func) or (__stdcall *one).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user