asm makro in vc 7
-
weiss vielleicht einer von euch wie man eine sprungmarke in einem asm makro definiert?
also folgendes geht bei mir nicht:
#define test __asm \ { \ __asm test ebp, ebp \ __asm jnz short gohere \ .... __asm gohere: \ }
hat jemand eine idee? dank in voraus.
adapto
-
probier mal ein normales C-Label (also ohne "__asm" davor), das müsste gehen... wenn du ansonsten den abstand zum sprunglabel schon weißt, kannst du ja selber den abstand zum label in bytes angeben
der assembler macht letzenendes auch nix anderes
-
probier mal ein normales C-Label
hab ich schon aber das geht leider nicht.
der 2te vorschlag klingt echt gut, damit gehts bestimmt aber ich weiss nicht wie ich zur sprungweite komme. ist es nicht so, das die sich auch ändern kann, je nach ausrichtung.
-
das ist ja das problem, sobald du irgendwelche instruktionen einfügst, entfernst oder änderst, ändert sich der relative abstand zur sprungmarke... ansonsten müsstest du gucken, wie groß jede einzelne instruktion zwischen dem jnz und der sprungmarke sind und deren größe addieren... dazu müsstest du einen etwas ausführlicheren CPU-Befehlssatz zu rate ziehen...
-
ok, das problem liegt wie es aussieht darin das der compiler makro labels als global definiert, so das man ein makro nur 1mal aurufen kann und bei mehreren aufrufen erscheint dann hier die Fehlermeldung:
error C2412: 'TESTIT': Marke, bei der nicht zwischen Groß- und Kleinschreibung unterschieden wird, wurde neu definiert
ich glaube da werde ich wohl tatsächlich die weite ausrechnen müssen um hier weiterzukommen.
danke
-
Eine Lösung dafür wäre evtl, dem Makro einen Parameter zu übergeben und den einfach beim label einzusetzen. Auf diese Weise kannst du jedes mal, wenn du das Makro verwendest, einen anderen Namen angeben... ist sicher nicht die eleganteste Lösung, aber besser als nichts... Ansonsten verwende doch einfach inline-Funktionen bzw. halt normale Funktionen, den Geschwindigkeitsunterschied kann man vernachlässigen...
-
wenn du dein test makro mehr als einmal in einer funktion aufrufst, wirst du sowieso ein problem bekommen, weil mehr als eine gleichnamige sprungmarke pro funktion nicht erlaubt is!?
-
@dot
ja, das ist genau das problem das ein makro anscheinend nicht lokal arbeitet. gibt es dafür keine lösung wie ich es doch mehrmals in einer funktion benutzen könnte?@todo
mir kam es gerade auf volle geschwindigkeitsausbeute an, da ich eine schnelle kompressionsmethode benötige. deshalb würde ich lieber auf funktionen ganz verzichten. und da die makros echt gross sind und sich gegenseitig auch mehrmals aufrufen würden wäre das schon eine enorme einbusse.das mit der parameterübergabe scheint echt eine gut lösung zu sein, aber da die makros sich auch untereinander aufrufen komme ich damit leider auch nicht weiter, oder ich müsste dem makro unzählige parameter mit auf dem weg geben.
der letzte ausweg ist alles makrofrei zu coden, aber dann wäre der code wirklich unlesbar, deshalb hoffe ich das es doch einen ausweg dafür gibt.
gruss
adapto
-
ach du sch**** also das, was du da beschreibst, ist doch das reine chaos... sorry, aber da würde ich echt mal aufräumen! ich würde generell lieber C/C++ Code schreiben und einen ordentlichen Compiler verwenden, der einigermaßen optimieren kann, damit kommst du in den meisten fällen besser... den kern (also innerhalb von schleifen usw.) kannst du dann immernoch per hand mit inline-asm optimieren, würde ich aber auch nicht empfehlen, weil du da den compiler in seinem optimierungslauf verwirrst... und makros, die sich gegenseitig nochmal "aufrufen" sind eine katastrophe...
-
ja kann sein, das ich da noch was dran machen muss, aber die c++ variante ist bei mir viel langsamer.
makros, die sich gegenseitig nochmal "aufrufen" sind eine katastrophe...
ok hier muss ich mir scheinbar echt was anderes einfallen lassen.
-
wenn dir die C++ variantle zu langsam ist, dann könntest du mal versuchen entweder den C++ code zu optimieren oder den algo neu zu überdenken...