![]() |
erste Gehversuche in Delphi InlineASM
Hallo,
das sind meine ersten Gehversuche in Delphi Inline ASM. Wie man sieht, es soll die Fibonacci Folge berechnen. Zum Einstieg habe ich mir ![]() Es funktioniert soweit ich sehr gut (bis Schritt 45, ab da geht's ins negative), schon bei meinem dritten oder vierten Anlauf funktionierte es =) Die Registergröße selbst kann man nicht ändern. Trotzdem gibt es ja Möglichkeiten, größere Werte (z.B. Int64) zu speichern. Wie gehe ich so etwas an? Mehrere Register für einen Zahlenwert nutzen vielleicht? Außerdem würde ich mich freuen, wenn Ihr Schönheitsfehler nennen würdet (funktionieren tut es ja...), damit ich mir das von Anfang an angewöhnen kann =)
Delphi-Quellcode:
//Edit: Wurde etwas gekürzt...
function fibonacci(step:integer):integer;
asm push ebx cmp step,2 jbe @@end mov ecx,step sub ecx,2 xor eax,eax mov ebx,1 mov edx,2 @@loop: xor eax,eax add eax,ebx add eax,edx mov ebx,edx mov edx,eax dec ecx cmp ecx,0 jne @@loop @@end: pop ebx end; //Edit2: Upps, da sind wohl ein paar Einrückungen futschgegangen... Danke im Voraus, Gruß, Frank. |
Re: erste Gehversuche in Delphi InlineASM
Was du benötigst ist "add with carry" (Addieren mit Übertrag) In asm ist das "adc"
du addierst erst die unteren 32bit und dann mit adc die oberen 32bit. Edit: Ein bisschen kürzen kannst du deinen Code schon noch, aber das ist dir sicherlich klar. Was mir noch auffällt ist folgendes: - Du rettest eax,ecx und edx und stellst die Register am Ende wieder her. Das ist nicht notwendig. Diese drei Register dürfen in Funktionen beliebig verändert werden. Ausserdem, und das ist Punkt 2: - In EAX landet das Ergebnis (also Result) - Step wird in EAX übergeben. Du kannst es zwar so lassen, dann wird der Compiler für dich noch ein wenig Arbeit verrichten (EAX=Step auf den Stack legen, dass du es von da immer ansprechen kannst) |
Re: erste Gehversuche in Delphi InlineASM
hi,
wenn du Delphi Code per Breakpoint irgendwo stoppst, und anschließend das CPU Fenster öffnest (in D6 mit STRG+ALT+C), dann siehst du dort den von Delpgi erstellten Assemblercode und kannst z.B. nackgucken wie Delphi 64-Bit Zahlen addiert. In einer normalen Delphi-Funktion, wird der Rückgabewert (also Result) sowieso in EAX gespeichert. Grüsse, Stefan |
Re: erste Gehversuche in Delphi InlineASM
Konnte dank euch beiden nun ein wenig gekürzt werden. Ich mache mich jetzt an die 64Bit Zahlen :)
|
Re: erste Gehversuche in Delphi InlineASM
Ein Vorschlag für int64 (Rückgabe jetzt in eax und edx)
Delphi-Quellcode:
function fibo(n:integer):int64;
asm mov ecx,eax xor eax,eax xor edx,edx test ecx,ecx jz @end inc eax add ecx,-2 jle @end push edi push esi mov edi,eax mov esi,edx @rep: push eax push edx add eax,edi adc edx,esi pop esi pop edi dec ecx jnz @rep pop esi pop edi @end: end; |
Re: erste Gehversuche in Delphi InlineASM
was bedeutet der Befehl '@@'?
|
Re: erste Gehversuche in Delphi InlineASM
Zitat:
Edit: ein @ hätte gereicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz