![]() |
Re: Byte an bestimmter Speicherposition mit Assembler lösche
Hallo Cyf,
das wird wahrscheinlich reiner Zufall sein. Bis bald Chemiker |
Re: Byte an bestimmter Speicherposition mit Assembler lösche
Code:
:wall: Das mit der CPU war eine gute Idee, hätte eigentlich gleich den Debugger mal fragen sollen.
Main.pas.61: ByteLoeschen2(@IntZahl, ByteNr);
00459861 8D45FC lea eax,[ebp-$04] 00459864 8BD3 mov edx,ebx 00459866 E84DFFFFFF call ByteLoeschen2 Der obige Aufrufcode sollte das ja erklären. Danke für die Hilfe. :thumb: |
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 :) |
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:
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.
Procedure SetZero(P:Pointer;Index:Integer);assembler;register;
ASM mov Byte Ptr [eax+edx],0 END; Einen schönen Tag noch Laplace |
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:
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: |
Re: Byte an bestimmter Speicherposition mit Assembler lösche
Hi,
Zitat:
Aus der D7-Hilfe: Zitat:
Zitat:
Mfg FAlter |
Re: Byte an bestimmter Speicherposition mit Assembler lösche
Die fünf in Delphi verfügbaren Aufrufkonventionen sind in der Delphi-Hilfe und bei
![]() 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. |
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 |
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 |
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. |
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