Absolutwert
-
Wie kann man mit Assembler den Absolutwert einer Zahl ermitteln?
-
orl %eax,%eax jns ok negl %eax :ok /* weiter ... */
?
-
wenn ich den asm-code in eine funktion in c++ einfüge und eine variable übergebe, kommt die fehlermeldung "inline assembler syntax error found in 'opcode' found in MOD;"
wo kann hier der Fehler sein?
-
du darfst vro die register keine "%"-zeichen schreiben. der compiler denkt, dass das der modulo-operator ist
außerdem weiß ich nicht, warum bei den op-codes (orl und negl) unbedingt das l danach stehen muss. der assembler sollte doch vn alleine in der lage sein, 32-bit anweisungen zu erkennencu todo
[ Dieser Beitrag wurde am 12.02.2003 um 14:53 Uhr von todo editiert. ]
-
Original erstellt von todo:
**du darfst vro die register keine "%"-zeichen schreiben. der compiler denkt, dass das der modulo-operator ist
außerdem weiß ich nicht, warum bei den op-codes (orl und negl) unbedingt das l danach stehen muss. der assembler sollte doch vn alleine in der lage sein, 32-bit anweisungen zu erkennencu todo
**Bei gcc/AT&T-Syntax müssen die %-Zeichen da sehr wohl hin und das l auch. Ist halt ne frage der Syntax. Für Intel-Synatx würde der Code demnach so heißen:
orl eax,eax jns ok neg eax :ok /* weiter ... */
[ Dieser Beitrag wurde am 12.02.2003 um 14:59 Uhr von TriPhoenix editiert. ]
-
ok ok, aber beim or kannst du immer noch das l wegmachen und label müssen ":" doch am ende und nicht davor haben oder gehört das auch zu dem standard??
-
stimmt, das : ist falsch, gehört am ende hin
in intel-syntax sähe das so aus:
or eax, eax
jns ok
neg eax
ok: ; weiterIch war davon ausgegangen, dass der Originalposter rudimentär Assembler kann, aber er will eine fix und fertige Copy&Paste-Lösung, um damit seinen C-Code zu "optimieren"
-
warum schreibst du optimieren in ""?? mit gezieltem einsatz von asm kann man oft ne ganze menge optimieren. man sagt zwar immer, dass der compiler im zusammenhang besser optimieren kann, aber das stimmt nicht immer. man selber kann oft viel problemspezifischer optimieren und weiß was geht und was nicht gehen muss... ich habe auf alle fälle durch kompllettes umschreiben meiner 3d-engine (ehemals c++) (berechnungs- und texture-mapping-teil) in asm die geschw. verdoppelt...
cu todo
-
danke, jetzt funktioniert es!
-
todo: weil der GCC z.B. von selbst so schlau ist, aus der Funktion
inline int abs(int x) { return x > 0 ? x : -x; }
folgenden inline-code zu erzeugen:
testl %eax,%eax jge .L5 negl %eax .L5:
irgendwie äquivalent zu dem was ich geschrieben hab
nun gut, test vs. or ... ich denk er weiss besser was schneller ist. bei jns vs. jge bin ich nicht ganz sicher, könnte glatt der gleiche befehl sein.
Du hast deine Engine sicher auch nicht 1:1 umgesetzt.
-
jge & jns sind nicht exakt das selbe:
• S is 8 (trigger if the sign flag is set); NS is 9.
• P and PE are 10 (trigger if the parity flag is set); NP and PO are 11.
• L and NGE are 12 (trigger if exactly one of the sign and overflow flags is set); GE and NL are 13.aus der NASM doku
Wenn der Code nur Teilweise in ASM geschrieben wird, ist die Wahrscheinlichkeit hoch, das der Compiler beim optimieren gestört wird. Andererseits können einige Features nur mit ASM genutzt werden (z.B. 3DNOW, MMX, XMM, ...).
Auch das schreiben des kompletten Codes in ASM kann die Performance erheblich verbessern, vorallem wenn keine externen Libs genutzt werden.mfg
-bg-