Frage: Was machen diese Funktionen ?
-
Hi!
Ich bin in einem Quellcode auf folgende Funktionen gestoßen. Leider kenne ich mich nicht mit ASM aus. Mich würde gerne mal interessieren was diese Funktionen bewirken!long mulscale30(long a, long d) { ASM ( "imull %%edx\n\t" "shrdl $30, %%edx, %%eax" // shrd eax, edx, 30 : "=a" (a) // output eax : "a" (a), "d" (d) // input eax edx : "cc" ); return a; } long divscale30(long a, long b) { ASM ( "movl %%eax, %%edx\n\t" // mov edx, eax "sarl $2, %%edx\n\t" // sar edx, 2 "shll $30, %%eax\n\t" // shl eax, 30 "idivl %%ebx" : "=a" (a) : "a" (a), "b" (b) : "edx", "cc" ); return a; } long klabs(long a) { ASM ( "testl %%eax, %%eax\n\t" "jns 0f\n\t" "negl %%eax\n\t" "0:" : "=a" (a) : "a" (a) : "cc" ); return a; }
Danke im Voraus
Benjamin[ Dieser Beitrag wurde am 27.06.2003 um 22:37 Uhr von ProfEich editiert. ]
-
also die letzte funktion macht eine negative zahl positiv:
mit test setzt er die flags, falls das sign flag gesetzt ist und die zahl somit negativ ist, wird sie negiert.bei den anderen hab ich keine ahnung.
-
so, hab versucht die 1. Funktion in C zu übersetzen:
long mulscale30(long a, long d) { return (a*d)>>30 }
der Umweg ist wahrscheinlich wegen der nur 32bit großen register gegangen worden.
Bin mir aber nicht ganz sicher, vorallem weil der 2. Parameter scheinbar in edx übergeben wird, oder ist long hier 64bit groß?Steige durch die 2.Funktion jetzt nicht so auf anhieb durch, aber ich würde mal auf anhieb sagen, dass sie in C vielleicht so aussehen würde:
long divscale30(long a, long d) { return (a/d)>>30 }
.
Es würde sicher helfen für welchen compiler das gedacht ist (gcc?) mit welchen optionen, und aus welchem kontext das stammt.
mfg
bg
-
Habs mir nochmal angeguckt, und sieht so aus als sähe die 2. Funktion in C so aus:
long divscale30(long a, long b) { return (a*pow(2,30)/b); }
wobei pow (basis, exponent) die Potenzfunktion ist.
Ich habe das hier anders geschrieben, weil hier das Vorzeichen erhalten bleibt.
ich verstehe allerdings immer noch nicht die Parameterübergabe, hier scheint b in ebx übergeben zu werden, so wie es sich gehört, aber bei der ersten???mfg
bg