Font
[thread]7462[/thread]

Inline-ASM: Problem



<< |< 1 2 >| >> 13 entries, 2 pages
master
 2005-11-12 13:23
#60042 #60042
User since
2003-10-20
610 articles
BenutzerIn
[default_avatar]
Habe das Inline-ASM Beispiel 1:1 kopiert(plus ein print) und modul installiert..

Es kommt aber immer dieser Fehler(woran könnte es liegen?):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print "ASM\n";

greet('Ingy');
greet(42);

use Inline ASM => <<'END', PROTO => { greet => 'void(char*)'};

.data
gstr: .string "Hello %s!\n"

.text
.globl greet

greet: movl 4(%esp),%eax
pushl %eax
pushl $gstr
call printf
leave
ret
END

Fehler-Code
----------------------------
F:\>C:\test.pl

Microsoft &reg; Program Maintenance Utility Version 1.50
Copyright &copy; Microsoft Corp 1988-94. All rights reserved.

C:\Perl\bin\perl.exe C:\Perl\lib\ExtUtils/xsubpp -typemap C:\Perl\lib\E
xtUtils\typemap test_pl_ce65.xs > test_pl_ce65.xsc && C:\Perl\bin\perl.exe -MEx
tUtils::Command -e mv test_pl_ce65.xsc test_pl_ce65.c
cl -c -nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_ST
RICT -DHAVE_DES_FCRYPT -DBUILT_BY_ACTIVESTATE -DNO_HASH_SEED -DUSE_SITECUSTOMIZE
-DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX
-MD -Zi -DNDEBUG -O1 -DVERSION=\"0.00\" -DXS_VERSION=\"0.00\" "-IC:\Perl\li
b\CORE" test_pl_ce65.c
Der Befehl "cl" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
NMAKE : fatal error U1077: 'F:\WINDOWS\system32\cmd.exe' : return code '0x1'
Stop.

A problem was encountered while attempting to compile and install your Inline
ASM code. The command that failed was:
nmake > out.make 2>&1

The build directory was:
F:\_Inline\build\test_pl_ce65

To debug the problem, cd to the build directory, and inspect the output files.

at C:\test.pl line 7
BEGIN failed--compilation aborted at C:\test.pl line 21.
----------------------------
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Dubu
 2005-11-12 14:21
#60043 #60043
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Offensichtlich wurde der Microsoft-Compiler cl.exe nicht gefunden, also ist er wohl entweder nicht installiert oder nicht im Pfad.
J-jayz-Z
 2005-11-12 22:05
#60044 #60044
User since
2005-04-13
625 articles
BenutzerIn
[Homepage] [default_avatar]
Versuch erstmal, den ASM Code so auszuführen. Das ist immer so eine Sache mit ASM. Der Code geht nicht auf jeden Prozessor. Du musst dir mal deinen Prozessor ansehen und lernen, wie die Register daruaf aussehen ...
Ist eine verdammte Arbeit, ich weiß, aber das gehört zu ASM :angry:
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
betterworld
 2005-11-12 22:44
#60045 #60045
User since
2003-08-21
2613 articles
ModeratorIn

user image
Jayz: Bei i386-kompatiblen Prozessoren sollte man da eigentlich keine Probleme haben. Wie Dubu schon sagte: Das Problem ist hier wohl, dass dieses cl nicht gefunden wird, und das hat nichts mit dem Assembler-Code an sich zu tun.
J-jayz-Z
 2005-11-13 01:06
#60046 #60046
User since
2005-04-13
625 articles
BenutzerIn
[Homepage] [default_avatar]
Jo, wenn sie kompatibel sind. Aber okay, wenn er den Code so assemblieren kann, hat er auch ein assembler installiert und dann findet perl den (hoffentlich...) auch. cl ... kenn ich gar nich
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
master
 2005-11-14 10:13
#60047 #60047
User since
2003-10-20
610 articles
BenutzerIn
[default_avatar]
Ich dachte Inline-ASM ist eine itegriert Assembler?

ps. das gleiche problem bekomme ich übrigens wenn ich
Inline C versuche...
klappt nicht.. kommt ein compiler-fehler.
bereits beim 1. Befehl..

Habe nur die Examples benutzt... die müssten doch funktionieren... brauch ich denn noch mehr als nur das Inline-Modul?


ps. gibts eigentlich eine Möglichkeit Maschinencode
direkt von Perl aus zu starten?
in Basic konnte man Maschinen-code eines obj-files direkt in eine variable laden und dann dem Prozessor übergeben.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
murphy
 2005-11-14 11:30
#60048 #60048
User since
2004-07-19
1776 articles
HausmeisterIn
[Homepage]
user image
- Bevor du eines der Inline Module verwendest, musst du natürlich den entsprechenden Compiler installieren, denn alle Inline Module verlassen sich auf externe Tools um den eingebetteten Code zu übersetzen.

- Standardmäßig wird unter Windows wohl immer die Makrosaft Toolchain benutzt. Das Beispiel das du da hast wird aber garantiert nicht mit einem Makrosaft Assembler funktionieren, da es im AT&T Assemblerdialekt geschrieben ist, wie ihn der GNU Assembler verwendet, nicht jedoch die Microsoft Tools, welche sich an den Intel Assemblerdialekt halten. Da würde derselbe Code ungefähr so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
segment data
gstr: db 'Hello %s!', 10, 13

segment code
global greet
extern _printf

greet: mov eax, [esp + 4]
push eax
push dword gstr
call _printf
leave
ret


- Auch wenn das hier nicht das Problem war, solltest du dir natürlich im klaren sein, dass Assembler nicht nur in verschiedenen Dialekten daherkommt sondern auch maximal maschinenspezifisch ist, sprich, was auf ix86 Prozessoren von Intel läuft, muss bei AMD Chips nicht unbedingt mehr funktionieren und umgekehrt; was auf irgendeiner intelkompatiblen Architektur läuft, funktioniert auf SPARC, MIPS oder PowerPC natürlich gar nicht mehr, etc.

- Mit einiger Magie aus dem B Modul kann man auch Binaercode in ein laufendes Perlprogramm einbauen, aber ich halte das nicht für einen sauberen Programmieransatz.
When C++ is your hammer, every problem looks like your thumb.
sesth
 2005-11-14 11:31
#60049 #60049
User since
2005-02-01
181 articles
BenutzerIn
[default_avatar]
[quote=master,12.11.2005, 12:23]cl -c -nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_ST
RICT -DHAVE_DES_FCRYPT -DBUILT_BY_ACTIVESTATE -DNO_HASH_SEED -DUSE_SITECUSTOMIZE
-DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX
-MD -Zi -DNDEBUG -O1 -DVERSION=\"0.00\" -DXS_VERSION=\"0.00\" "-IC:\Perl\li
b\CORE" test_pl_ce65.c
Der Befehl "cl" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.[/quote]
Wie Dubu schon geschrieben hat, wird der C-Compiler nicht gefunden. Perl extrahiert den C- bzw. Assembler-Code und übergibt ihn an den C-Compiler. Der ist entweder nicht installiert oder nicht im PATH aufgeführt. Ein direktes Ausführen des Befehls auf der Kommandozeile wird vermutlich den gleichen Fehler erzeugen. Du bekommst auch keinen Compiler-Fehler, sondern eine Meldung von NMAKE, das offensichtlich gefunden wird.
Gruß
Thomas
master
 2005-11-15 10:34
#60050 #60050
User since
2003-10-20
610 articles
BenutzerIn
[default_avatar]
@murphy usw.
ps. es soll ja nicht eh nicht Plattform unabhängig. bzw. ich kann es leicht für andere Plattformen umschreiben..

Hier gehts rein um performance.
Was gibts denn besseres als Perl mit C oder ASM zu koppeln? das ist doch ideal.. eine Hochsprache mit High-speed zu kombinieren..


Kann ich sonst z.b. per Perl auf ein CPU-Register Zugreiffen?
1. externes ASM-Programm starten(dll? oder objektfile mit B?)
2. werte ins register
3. mit Perl wert auslesen und variable zuteilen


Wie kann ich also ASM - Code am besten einbinden?
wie würdes du es machen? Denk dran ich will maximale perfomance mit Perl verbinden. und die Werte an Perl übergeben.

Längerfristig will ich auch C/C++ inline schreiben...
so als einstieg :-) da dies komfortabler ist als in ASM.
aber ASM ist für mich momentan sehr wichtig
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
J-jayz-Z
 2005-11-15 11:02
#60051 #60051
User since
2005-04-13
625 articles
BenutzerIn
[Homepage] [default_avatar]
Wieso schreibst du kein reines ASM Programm sondern willst mit Perl darauf zugreifen?
Vielleicht hilft das: http://webster.cs.ucr.edu/AoA/Windows/HTML/AoATOC.html

Ansonsten kenne ich außer Inline keine Methode direkt auf die Funktionen zuzugreifen...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 >| >> 13 entries, 2 pages



View all threads created 2005-11-12 13:23.