Discussion:
fasm.exe und fadd
(zu alt für eine Antwort)
Jens Kallup
2014-05-24 18:25:15 UTC
Permalink
Hallo,

weiss jemand von Euch woe man dei menomic "fadd"
unter dem FASM.EXE Assembler einsetzt?
Bei mir spuckt der immer den Fehler aus:
"invalid operand."

Danke für Aufklärung
Jens
Bernhard Schornak
2014-05-24 19:27:44 UTC
Permalink
Post by Jens Kallup
Hallo,
weiss jemand von Euch woe man dei menomic "fadd"
unter dem FASM.EXE Assembler einsetzt?
"invalid operand."
Operation Ergebnis in

FADD st(X) ; ST0
FADD st(X), st(0) ; STx
FADD st(0), st(X) ; ST0
FADD [mem32] ; ST0
FADD [mem64] ; ST0


Welche "Namen" FASM für die FPU-Register erwartet, ist sicher
in der Dokumentation beschrieben.


Grüsse aus Augsburg

Bernhard Schornak
Jens Kallup
2014-05-25 10:59:21 UTC
Permalink
Hallo Bernhard,

danke füe Deine Rückmeldung.
Vorf einigen Stunden habe ich gelesen können,
das fadd und dergleichen 387 krimskrams "deprecated"
sei und ich lieber SSE nutzen solle.
Nun, ist für mich ein wenig Umstellungssache, aber
ich habe jetzt folgendes herausklabustert:

movups xmm0, [_LC14]
movups xmm1, [_LC15]
movups xmm2, [_LC15]
addps xmm1, xmm2
mulps xmm0, xmm1

cvtss2sd xmm0, xmm0

sub esp, 8
movq [esp], xmm0


call [__imp__testDLL2] ; call dll func
add esp, 16 ; reset tos


_LC14: dd 5.000001
_LC15: dd 3.000002
_LC16: dd 4.000003

Gruß aus Eisenach
Jens
Bernhard Schornak
2014-05-25 15:32:53 UTC
Permalink
Post by Jens Kallup
Hallo Bernhard,
danke füe Deine Rückmeldung.
Vorf einigen Stunden habe ich gelesen können,
das fadd und dergleichen 387 krimskrams "deprecated"
sei und ich lieber SSE nutzen solle.
SSE ist wesentlich schneller. Ausser Multiplikation/Division
werden die meisten Befehle in 2 Takten (AMD) abgearbeitet.
Post by Jens Kallup
Nun, ist für mich ein wenig Umstellungssache, aber
...
sub esp, 8
movq [esp], xmm0
Das liesse sich noch zu

movq [esp-8], xmm0

verkürzen. 128 Bit MOV-Befehle (ausser MOVDQU) erwarten eine
durch 16 teilbare Adresse (bei AVX sogar 32!), sonst gibt es
einen GPF-Absturz.


Gruss zurück nach Eisenach!

Bernhard
Jan K.
2014-06-22 00:37:40 UTC
Permalink
Post by Jens Kallup
Hallo Bernhard,
danke füe Deine Rückmeldung.
Vorf einigen Stunden habe ich gelesen können,
das fadd und dergleichen 387 krimskrams "deprecated"
sei und ich lieber SSE nutzen solle.
das ist nur bedingt richtig, bei 64 bit programmen
werden die sse register standardmäßig verwendet,
soweit richtig, beim beispiel unten aber nicht.
Post by Jens Kallup
Nun, ist für mich ein wenig Umstellungssache, aber
movups xmm0, [_LC14]
movups xmm1, [_LC15]
movups xmm2, [_LC15]
addps xmm1, xmm2
mulps xmm0, xmm1
cvtss2sd xmm0, xmm0
sub esp, 8
movq [esp], xmm0
call [__imp__testDLL2] ; call dll func
add esp, 16 ; reset tos
_LC14: dd 5.000001
_LC15: dd 3.000002
_LC16: dd 4.000003
obiges ist gelinde gesagt unsinn da du 4 single values
bearbeitest und dann nur einen in double umwandelst
und übergibst, mit einem single wert wäre es:

movss xmm0, [_LC15]
addss xmm0, xmm0
mulss xmm0, [_LC14]
cvtss2sd xmm0, xmm0
sub esp, 8
movq [esp], xmm0
call [__imp__testDLL2] ; call dll func
add esp, 16 ; reset tos



und das sub esp, 8 ließe sich nicht verkürzen da hier
8 bytes auf dem stack reserviert werden auf welche
das ergebnis gespeichert wird und die aufgerufene
prozedur dann zugreift.

Loading...