Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Byte an bestimmter Speicherposition mit Assembler löschen (https://www.delphipraxis.net/114752-byte-bestimmter-speicherposition-mit-assembler-loeschen.html)

Chemiker 30. Mai 2008 18:19

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Hallo Cyf,

das wird wahrscheinlich reiner Zufall sein.

Bis bald Chemiker

Cyf 30. Mai 2008 18:49

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Code:
Main.pas.61: ByteLoeschen2(@IntZahl, ByteNr);
00459861 8D45FC          lea eax,[ebp-$04]
00459864 8BD3             mov edx,ebx
00459866 E84DFFFFFF      call ByteLoeschen2
:wall: Das mit der CPU war eine gute Idee, hätte eigentlich gleich den Debugger mal fragen sollen.
Der obige Aufrufcode sollte das ja erklären.

Danke für die Hilfe. :thumb:

brechi 30. Mai 2008 19:10

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
davon abgesehen dass man direkt nen PByte(bla)^ := 0 machen kann (sofern bla dann schon an der richtigen stelle ist)

warum nicht:

Delphi-Quellcode:
procedure ByteLoeschen(p: Pointer; Index: Integer);
asm
  MOV BYTE PTR [EAX+EDX], 0
end;
?

ops gerade erst gesehen dass du das schon hast :)

Laplace 2. Jun 2008 09:21

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Guten Morgen :-D ,

ich möcht' nur noch eine kleine Anmerkung machen:
ich programmier' selber gern in Assembler und in meinen Programmen/Units geb' ich die Übergabekonvention immer explizit an, also (assembler;register;).

Delphi-Quellcode:
Procedure SetZero(P:Pointer;Index:Integer);assembler;register;
ASM
    mov Byte Ptr [eax+edx],0
END;
Bei maximal 3 Übergabeparametern ist 'register' zwar die Standardübergabekonvention (zumindest bei meinem Delphi 4 :oops:), die explizite Angabe bewahrt mich aber ganz sicher vor Überraschungen.


Einen schönen Tag noch
Laplace

Cyf 2. Jun 2008 15:37

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Bei der Gelegenheit wäre vielleicht auch eine Auflistung aller Übergabekonventionen noch mal intressant, konnte aber per Suche keine finden, sind zumindest diese jetzt so korrekt?

register : Die ersten drei Argumente der Reihenfolge nach in EAX, EDX und ECX, ggf. die Restlichen auf dem Stack
Zitat:

Der erste Parameter von links, der auf den Stack geschoben wird, wird im Gegensatz zu CDecl, StdCall und Safecall als erstes auf den Stack geschoben und liegt damit, wie übrigens auch bei Pascal, zuunterst.
Standard-Aufrufkonvention.

stdcall: Alle Argumente auf dem Stack, auch hier wieder je weiter hinten, desto weiter "unten"

Es gibt noch CDecl, aber wie sie da angeordnet sind bin ich nicht sicher.

Wäre eventuell sinnvoll, das in einem extra Thema mal zu sammeln, weil das sicher immer mal wieder intresannt sein kann. (auch z.B. für dll s)

[EDIT] Fehler beseitigt, nicht das es hier wer falsch liest. :stupid:

FAlter 2. Jun 2008 15:49

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Hi,

Zitat:

Zitat von Laplace
ich programmier' selber gern in Assembler und in meinen Programmen/Units geb' ich die Übergabekonvention immer explizit an, also (assembler;register;).

[...] die explizite Angabe bewahrt mich aber ganz sicher vor Überraschungen.

Dann solltest du das "assembler" aber weglassen, denn veralgtete Schlüsselworte können manchmal für Überraschungen sorgen. Wie die Überraschung, dass "inline" eine neue Bedeutung bekommen hat...

Aus der D7-Hilfe:

Zitat:

The reserved word inline and the directive assembler are maintained for backward compatibility only. They have no effect on the compiler.
Aus der Turbo-Delphi-Hilfe (D2006):

Zitat:

Beim Delphi-Compiler ermöglicht zur Verbesserung der Leistung, Funktionen und Prozeduren mit der Direktive inline zu versehen. Wenn eine Funktion oder Prozedur bestimmten Kriterien entspricht, fügt der Compiler Code direkt ein anstatt einen Aufruf zu generieren. Das Ergebnis dieser Leistungsoptimierung ist schnellerer Code, der jedoch mehr Speicherplatz in Anspruch nimmt. Der Compiler produziert dabei eine größere Binärdatei. Die Direktive inline wird in Funktions- und Prozedurdeklarationen und -definitionen, genau wie andere Direktiven, verwendet.
Wer weiß, wie es bald mal mit "assembler" aussehen wird?

Mfg
FAlter

Apollonius 2. Jun 2008 16:56

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Die fünf in Delphi verfügbaren Aufrufkonventionen sind in der Delphi-Hilfe und bei Luckie aufgelistet.
CyFs Beschreibung von Register ist nicht ganz korrekt: Der erste Parameter von links, der auf den Stack geschoben wird, wird im Gegensatz zu CDecl, StdCall und Safecall als erstes auf den Stack geschoben und liegt damit, wie übrigens auch bei Pascal, zuunterst.

@Laplace: Die Standard-Aufrufkonvention ist unabhängig von der Parameteranzahl und der Delphi-Version immer Register.

Laplace 2. Jun 2008 20:11

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Hallo Appolonius :hi:,

soweit ich weiß, sind (zumindest in D4) nur EAX, EDX und ECX in Assembler frei verfügbar. Wenn du mehr als 3 Parameter übergeben willst, reichen die Register also (alleine) nicht aus.


Hallo FAlter :) ,

die angegebene Syntax (assembler;register) stammt aus dem Handbuch für Delphi 4. Mag bei anderen Compilerversionen unterschiedlich sein. Aber danke für deinen Hinweis :P .


Schönen Abend noch
Laplace

Apollonius 2. Jun 2008 20:14

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Hallo Laplace,
das ist natürlich richtig. Doch zur Aufrufkonvention Register gehört eben auch, dass überzählige Parameter in der Reihenfolge der Deklaration auf den Stack gepusht werden. Nur weil es zu viele (oder zu große) Parameter sind, wird also nicht plötzlich die Aufrufkonvention StdCall verwendet.
Grüße
Apollonius

Laplace 2. Jun 2008 20:22

Re: Byte an bestimmter Speicherposition mit Assembler lösche
 
Hallo Appolonius :-D ,

weiß schon.
Bei mir ist's so, dass immer wenn ich eine interne Funktion bzw. Prozedur mit max. 3 Parametern aufrufen/schreiben kann, dann juckt's mich, das in assembler zu schreiben - hauptsächlich bei Stringoperationen. Maximal 3 Parameter halte ich für (interne) Assemblerroutinen als fast optimal.
Ansonsten ist mir das eher zu 'unübersichtlich' und weiche (nur) notfalls auf die Deklaration 'pascal' aus.


Schönen Abend noch
Laplace


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.
Seite 2 von 3     12 3      

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