AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi asm-Befehler innerhalb eines Delphi Programmes
Thema durchsuchen
Ansicht
Themen-Optionen

asm-Befehler innerhalb eines Delphi Programmes

Ein Thema von CarstenP · begonnen am 11. Dez 2006 · letzter Beitrag vom 12. Dez 2006
Antwort Antwort
CarstenP

Registriert seit: 4. Aug 2006
Ort: Dortmund
8 Beiträge
 
#1

asm-Befehler innerhalb eines Delphi Programmes

  Alt 11. Dez 2006, 15:52
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: asm-Befehler innerhalb eines Delphi Programmes

  Alt 11. Dez 2006, 18:12
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;
Andreas
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#3

Re: asm-Befehler innerhalb eines Delphi Programmes

  Alt 11. Dez 2006, 18:15
Moin,

da du dich ja über jede Information freust, vielleicht hilft dir folgendes ein bisschen.
Inline ASM mit Borland Delphi - Einsteiger Crashkurs
  Mit Zitat antworten Zitat
11. Dez 2006, 18:16
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

Registriert seit: 4. Aug 2006
Ort: Dortmund
8 Beiträge
 
#5

Re: asm-Befehle innerhalb eines Delphi Programmes

  Alt 12. Dez 2006, 17:48
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: asm-Befehle innerhalb eines Delphi Programmes

  Alt 12. Dez 2006, 17:52
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz