From 3ebf898e88f1f3c9347bba11e8a6ee2bdb83dded Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Tue, 6 Dec 2005 18:43:59 +0000 Subject: [PATCH] Support for indirect calls in x86 assembler modules. --- crypto/perlasm/x86ms.pl | 7 ++++--- crypto/perlasm/x86nasm.pl | 5 +++-- crypto/perlasm/x86unix.pl | 1 + crypto/x86cpuid.pl | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crypto/perlasm/x86ms.pl b/crypto/perlasm/x86ms.pl index 23cb121e26..82538a9a9a 100644 --- a/crypto/perlasm/x86ms.pl +++ b/crypto/perlasm/x86ms.pl @@ -172,6 +172,7 @@ sub main'popf { &out0("popfd"); $stack-=4; } sub main'bswap { &out1("bswap",@_); &using486(); } sub main'not { &out1("not",@_); } sub main'call { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("test",@_); } @@ -436,7 +437,7 @@ sub out1p local($name,$p1)=@_; local($l,$t); - push(@out,"\t$name\t ".&conv($p1)."\n"); + push(@out,"\t$name\t".&conv($p1)."\n"); } sub main'picmeup @@ -452,10 +453,10 @@ sub main'initseg local($f)=@_; local($tmp)=<<___; OPTION DOTNAME -.CRT\$XIU SEGMENT DWORD PUBLIC 'DATA' +.CRT\$XCU SEGMENT DWORD PUBLIC 'DATA' EXTRN _$f:NEAR DD _$f -.CRT\$XIU ENDS +.CRT\$XCU ENDS ___ push(@out,$tmp); } diff --git a/crypto/perlasm/x86nasm.pl b/crypto/perlasm/x86nasm.pl index 78b1f94c07..b6dfcbdf02 100644 --- a/crypto/perlasm/x86nasm.pl +++ b/crypto/perlasm/x86nasm.pl @@ -184,6 +184,7 @@ sub main'popf { &out0("popfd"); $stack-=4; } sub main'bswap { &out1("bswap",@_); &using486(); } sub main'not { &out1("not",@_); } sub main'call { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("test",@_); } @@ -422,7 +423,7 @@ sub out1p my($name,$p1)=@_; my($l,$t); - push(@out,"\t$name\t ".&conv($p1)."\n"); + push(@out,"\t$name\t".&conv($p1)."\n"); } sub main'picmeup @@ -439,7 +440,7 @@ sub main'initseg if ($main'win32) { local($tmp)=<<___; -segment .CRT\$XIU data +segment .CRT\$XCU data extern $under$f DD $under$f ___ diff --git a/crypto/perlasm/x86unix.pl b/crypto/perlasm/x86unix.pl index 348bf2d357..e71050b6bc 100644 --- a/crypto/perlasm/x86unix.pl +++ b/crypto/perlasm/x86unix.pl @@ -200,6 +200,7 @@ sub main'call { my $pre=$under; { if ($label{$i} eq $_[0]) { $pre=''; last; } } &out1("call",$pre.$_[0]); } +sub main'call_ptr { &out1p("call",@_); } sub main'ret { &out0("ret"); } sub main'nop { &out0("nop"); } sub main'test { &out2("testl",@_); } diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl index d4066e8858..c53c9bc998 100644 --- a/crypto/x86cpuid.pl +++ b/crypto/x86cpuid.pl @@ -183,7 +183,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } &mov ("eax",&DWP(12+$i*4,"ebp")); &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 # without paying attention to what we called, # (__cdecl *func) or (__stdcall *one). -- 2.25.1