Frage an die ASM Leute
-
Hallo,
ich programmiere in C an einer kleinen 3D Engine und bin im Internet auf diese Funktion(Makro) gestoßen.!Nur ein Teil davon!
#define Transform(pfMat,pfVec,pfOut) __asm \ { \ __asm mov eax,dword ptr [pfVec] \ __asm mov ebx,dword ptr [pfMat] \ __asm mov ecx,dword ptr [pfOut] \ __asm fld dword ptr [eax+0] \ __asm fmul dword ptr [ebx+0] \ __asm fld dword ptr [eax+0] \ __asm fmul dword ptr [ebx+4] \ __asm fld dword ptr [eax+0] \ __asm fmul dword ptr [ebx+8] \ __asm fld dword ptr [eax+4] \ __asm fmul dword ptr [ebx+16] \ __asm fld dword ptr [eax+4] \ __asm fmul dword ptr [ebx+20] \ __asm fld dword ptr [eax+4] \ __asm fmul dword ptr [ebx+24] \ . . .
Jetzt meine Frage.
__asm mov eax,dword ptr [pfVec] \ __asm mov ebx,dword ptr [pfMat] \ __asm mov ecx,dword ptr [pfOut] \
Diese legen doch die Werte der Variablen in die erweiterten a,b und c Register?
oder nicht? Was ist wenn mehrer Funktionen übergeben werden müssen? So das die Register nicht mehr ausreichen? Und kann ich auch edx verwenden?__asm fld dword ptr [eax+0] \ __asm fmul dword ptr [ebx+0] \ __asm fld dword ptr [eax+0]
So diese Zeilen kommen gleich nach den anderen. Was bedeutet fld? fmul multipliziert doch die Werte zweier Register? Wird hier register eax mit ebx multipliziert? Oder was??
Ich will noch einige Funktionen selber in asm umschreiben aber habe sehr wenig Ahnung von asm. Deshalb reicht mir mal für den Anfang diese beiden "kleinen" Fragen zu verstehen. Und wie die Funktion arbeitet.
danke
-
Original erstellt von <gast>:
**
Jetzt meine Frage.__asm mov eax,dword ptr [pfVec] \ __asm mov ebx,dword ptr [pfMat] \ __asm mov ecx,dword ptr [pfOut] \
Diese legen doch die Werte der Variablen in die erweiterten a,b und c Register?
oder nicht? Was ist wenn mehrer Funktionen übergeben werden müssen? So das die Register nicht mehr ausreichen? Und kann ich auch edx verwenden?
**edx kannst du gerne verwenden meines Wissens nach, hindert dich keiner dran.
Wenn kein Platz mehr ist muss man das in den Registern halten was aktuell benötigt wird und die gerade unwichtigen Dinge irgendwo im Speicher (z.B. aufm Stack/in lokalen Variablen) zwischenlagern.**```cpp
__asm fld dword ptr [eax+0]
__asm fmul dword ptr [ebx+0]
__asm fld dword ptr [eax+0]So diese Zeilen kommen gleich nach den anderen. Was bedeutet fld? fmul multipliziert doch die Werte zweier Register? Wird hier register eax mit ebx multipliziert? Oder was??**
Hier wird in den Fließkommaregistern gerechnet.
Grob gesagt funktionieren die als ein Stack, also ein Haufen von Datenwerten. Man kann maximal 7 Zahlen auf diesem Stack haben.
fld lädt von der angegebenen Speicherstelle die Zahl oben auf den Stack drauf. In Assembelr werden Speicherstellen immer mit [] angegeben, d.h. die erste Zeile lädt nicht den Wert von eax, sondern die Fließkommazahl, die an der Adresse im Speicher steht, die in eax gerade liegt.
Damit liegt also das wo eax draufzeigt dann oben auf dem Stack.
fmul ist eine Fließkommamultiplikation, auch hier mit einer Speicherstelle. Hier wird das was oben auf dem Stack gerade liegt mit dem multipliziert, was an der Adresse liegt, die in ebx drin ist. Das Ergebnis leigt dann wieder oben auf dem Stack.Ich hoffe das hilft für den Anfang
-
ja. Jetzt wird einiges klarer
(aber nur einiges)
Jetzt weiss ich was mit push und pop gemeint ist. Damit kann ich wenn es nötig wird Werte auf dem Stack sichern (zwischenspeichern) und wenn ich es brauche wieder in den Register holen.
Noch eine Frage nachgeworfen:
eax[1] währe ein zweiter fließkomma Wert im eax Register. Geht das so? Meinst du das? ( eax[0]...eax[6]) sieben Werte max.
-
Moin, Moin...
Du bringst jetzt etwas durcheinander. In eax und den anderen Registern können KEINE Fließkommazahlen abgespeichert werden sondern nur Ganzzahlwerte. In den ersten drei Zeilen werden wohl die Adressen der Variablen in die Register gelegt.
_asm fld dword ptr [eax+0] -> Wenn das Register in Klammern gesetzt wird, so wird damit die indirekte Adressierung verwendet. In diesem Fall wird also der Inhalt von eax als Adresse interpretiert. Zu dieser Adresse wird 0 addiert und der Wert, der an der nun erhaltenen Adresse steht in das oberste Fließkommaregister(TOS) geladen.
Das +0 könnte man auch weglassen.Die Fließkommaregister werden normalerweise mit st(0)...st(7) bezeichnet.
Ciao...