![]() |
asm-Befehler innerhalb eines Delphi Programmes
Hallo!
Ich versuche im Moment für ![]() Zum Lernen versuche ich die Beispiele auf ![]() 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 |
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; |
Re: asm-Befehler innerhalb eines Delphi Programmes
Moin,
da du dich ja über jede Information freust, vielleicht hilft dir folgendes ein bisschen. :P ![]() |
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 ;) |
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. ![]() 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 |
Re: asm-Befehle innerhalb eines Delphi Programmes
Zitat:
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