AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Byte an bestimmter Speicherposition mit Assembler löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Byte an bestimmter Speicherposition mit Assembler löschen

Ein Thema von Cyf · begonnen am 30. Mai 2008 · letzter Beitrag vom 3. Jun 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 30. Mai 2008, 19:19
Hallo Cyf,

das wird wahrscheinlich reiner Zufall sein.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#12

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 30. Mai 2008, 19:49
Code:
Main.pas.61: ByteLoeschen2(@IntZahl, ByteNr);
00459861 8D45FC          lea eax,[ebp-$04]
00459864 8BD3             mov edx,ebx
00459866 E84DFFFFFF      call ByteLoeschen2
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.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#13

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 30. Mai 2008, 20:10
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
  Mit Zitat antworten Zitat
Laplace

Registriert seit: 21. Okt 2007
Ort: Kronach
9 Beiträge
 
Delphi 4 Standard
 
#14

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 10:21
Guten Morgen ,

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 ), die explizite Angabe bewahrt mich aber ganz sicher vor Überraschungen.


Einen schönen Tag noch
Laplace
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#15

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 16:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#16

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 16:49
Hi,

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
Felix Alter
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 17:56
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Laplace

Registriert seit: 21. Okt 2007
Ort: Kronach
9 Beiträge
 
Delphi 4 Standard
 
#18

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 21:11
Hallo Appolonius ,

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 .


Schönen Abend noch
Laplace
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 21:14
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Laplace

Registriert seit: 21. Okt 2007
Ort: Kronach
9 Beiträge
 
Delphi 4 Standard
 
#20

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 2. Jun 2008, 21:22
Hallo Appolonius ,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:11 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