Support for indirect calls in x86 assembler modules.

This commit is contained in:
Andy Polyakov 2005-12-06 18:43:59 +00:00
parent a4c886e4c8
commit 3ebf898e88
4 changed files with 9 additions and 6 deletions

View File

@ -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);
} }

View File

@ -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
___ ___

View File

@ -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",@_); }

View File

@ -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).