Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   asm-Befehler innerhalb eines Delphi Programmes (https://www.delphipraxis.net/82339-asm-befehler-innerhalb-eines-delphi-programmes.html)

CarstenP 11. Dez 2006 14:52


asm-Befehler innerhalb eines Delphi Programmes
 
Hallo!

Ich versuche im Moment für GLscene den Q3 RSqrt Source in Assembler zu übertragen. Ich habe dabei die Gelegenheit zu lernen wie man moderne CPUs in Assembler programmiert.

Zum Lernen versuche ich die Beispiele auf dieser Webseite in eine kleine Assemblerfunktion zu übernehmen.

Aber dort scheitere ich auch schon.

Ich würde gerne mit fld oder fild einen simplen Float Wert (0.5) in den Fliesskommastack einladen, um dort weitere Berechnungen mit Variablen auszuführen.

Aber egal wie ich es anstelle

fld 0.5
fild 0.5
fld (0.5)
fild (0.5)
fild dword 0.5
fld st(0.5)

ich bekomme ständig die Fehlermeldung Ungültige Kombination von Opcode und Operanden bzw. Inline Assembler Syntaxfehler.

Anscheinend kann ich fld bzw fild nur mit st(GANZZAHL) "füttern". Ich könnte ja jetzt einfach die Fünf in den stack packen, die 10 in den Stack packen, und dann dividieren, aber das wäre ja nicht sonderlich klug.

Nun bin ich aber nicht sehr sicher was st() macht, und wie ich meine Fliesskommawerte (zB 0.5) in den fliesskommastack bekomme.

EDIT: Da habe ich ja ein Eigentor geschossen. st ist wohl anscheinen einfach ein Wert im Stack. Werte kann ich damit nicht "einlesen".

Über jede Information zu diesem sehr speziellen Thema würde ich mich freuen.

mit freundlichen Grüßen,
Carsten

shmia 11. Dez 2006 17:12

Re: asm-Befehler innerhalb eines Delphi Programmes
 
Delphi hat nicht unbedingt einen Assembler an Bord, der up-to-date ist.
Workaround:
nimm einen Assembler, der den gewünschten Befehl beherrscht, lass dir den Maschinencode anzeigen und benützte dann die DB (define Byte) Anweisung.
Hier ein Beispiel:
Delphi-Quellcode:
function GetCPUTick: Int64;
asm
   DB $0F,$31 // RDTSC
end;

Balu der Bär 11. Dez 2006 17:15

Re: asm-Befehler innerhalb eines Delphi Programmes
 
Moin,

da du dich ja über jede Information freust, vielleicht hilft dir folgendes ein bisschen. :P
Inline ASM mit Borland Delphi - Einsteiger Crashkurs

DP-Maintenance 11. Dez 2006 17:16

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht noch um Delphi => ab in die Delphi-Sparte ;)

CarstenP 12. Dez 2006 16:48

Re: asm-Befehle innerhalb eines Delphi Programmes
 
Ich hätte nie gedacht, das es so aufwendig wird.

Ich habe zwar den Anfängerkurs nochmal gelesen, leider wird da nicht direkt drauf eingegangen wie man "simple" Gleitkomma Zahlen in den Gleitkommastack bekommt.

Nun gut. Ich weiss halt noch das es für Gleitkommawerte ja eine IEEirgendwas Darstellung gab. Und meine Erste Annahme ist, das die FPU NUR damit rechnet.

Wenn ich also einen "simplen" Single Wert wie 0.5 in einen Gleitkommawert übertragen will, dann benutze ich ein Tool, das ich hier entdeckt habe.

http://www.h-schmidt.net/FloatApplet/IEEE754de.html

Um ein wenig abzukürzen, 0.5 Ist als IEE7.. Wert in Hex 3F000000

Weiterhin erinnere ich mich auch noch daran, das Intel (oder besser x86) CPUs eine andere endian Darstellung haben.

Also wird aus 3F000000 0000003F.

Darüber hinaus nehme ich an, das die FPU mit EINFACHER Genauigkeit (32Bit) arbeitet.

Kurzum, um meine 0,5 in den Gleitkommastack zu packen brauche ich.

FLD DOUBLEWORD $0000003F
geht nicht

fld dd $0000003F
auch nicht

muss man vielleicht 0.5 erst als "assembler" variable belegen?
B DD $0000003F
fld B
Nein, wenn, dann zumindest nicht so.

Bah, warum ist das so schwer? Die einzige Möglichkeit die ich sehe, ist folgende:
function RSqrt(x: single): single;
var
r: single;
const
constZeroPointFive : single = 0.5;
asm
fld constZeroPointFive
....

Aber ist das nicht schon wieder sehr viel overhead?

Meine Frage wäre dann: Gibt es nicht einen einfacheren Weg eine KONSTANTE Gleitkommazahl in den Gleitkommastack zu werfen?

Danke nochmal,
Carsten

Dax 12. Dez 2006 16:52

Re: asm-Befehle innerhalb eines Delphi Programmes
 
Zitat:

Zitat von CarstenP
Bah, warum ist das so schwer? Die einzige Möglichkeit die ich sehe, ist folgende:
function RSqrt(x: single): single;
var
r: single;
const
constZeroPointFive : single = 0.5;
asm
fld constZeroPointFive
....

Aber ist das nicht schon wieder sehr viel overhead?

Meine Frage wäre dann: Gibt es nicht einen einfacheren Weg eine KONSTANTE Gleitkommazahl in den Gleitkommastack zu werfen?

Nein, es ist optimal. ;) Besseren Code als Delphi in diesem Fall produziert kannst du nicht machen. Außerdem erhöht es die Lesbarkeit ungemein...

Zu der zweiten Frage: es gibt einen. fld1 glaube ich heißt der und läd 1 auf den FPU-Stack..

PS: Die FPU rechnet mit 80(!) Bit, also präziser als Double mit 64.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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