Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Inline ASM (https://www.delphipraxis.net/9930-inline-asm.html)

Lillebrohr 7. Okt 2003 22:05


Inline ASM
 
Guten Tag,


also ich habe ein Programm geschrieben das zu 90% aus inline ASM besteht.

So am ende hab ich einen Wert aus einem Register einer Variable übergeben.

mov iResult, eax

nach dem abschließenden end; möchte ich nun den Inhalt in einem Edit ausgeben.
Doch wenn ich nun neu kompiliere und auf den Button drücke der dann den Wert in dem Edit Feld
anzeigen lassen soll. Aber nach dem Drücken kommt eine Meldung das er an der Adresse FFFFFF nicht zugreifen kann.

So wenn ich aber mit mit Showmessage rangehe dann funktioniert es. Aber warum ???

Kann sich jemand das erklären ??



MfG

LB

neolithos 7. Okt 2003 22:27

Re: Inline ASM
 
hast du ebx wiederhergestellt? bzw verwendet.

Lillebrohr 7. Okt 2003 22:29

Re: Inline ASM
 
Guten Tag,

ja ich habe ebx benutzt. Aber warum muss ich das "wiederherstellen" ?? :(



MfG


LB

jbg 7. Okt 2003 22:39

Re: Inline ASM
 
... Weil Delphi dann die Daten in [ebx] benutzen kann.

Lillebrohr 7. Okt 2003 22:49

Re: Inline ASM
 
Guten Tag,


Naja, also einfach ebx am Anfang sichern und am Ande wieder zurücksetzen.


Code:
asm
mov iEBX, ebx
...

mov ebx, iEBX


end;
oder soll ich es besser über den Stack machen ??

MfG

LB

neolithos 7. Okt 2003 22:49

Re: Inline ASM
 
in ebx steht die Instance-Adresse des objectes in dem die Prog. gerade ausgeführt wird.

jbg 8. Okt 2003 00:04

Re: Inline ASM
 
Und bei Kylix die GOT (Global Offset Table).

Lillebrohr 8. Okt 2003 00:54

Re: Inline ASM
 
Guten Morgen,


also mach ich es so wie oben beschrieben. Oder wie macht ihr das ???



MfG LB


/Edit

aber warum funzt es dann mit showmessage aber nicht mit edit1.text ?
\Edit

negaH 8. Okt 2003 03:35

Re: Inline ASM
 
Delphi-Quellcode:
asm
  PUSH EBX

  POP  EBX
end;
Unter Windows musst du nichts weiter beachten.
Unter Kylix steht in EBX die "Globale Object Table" und diese sollte in deinem Assemblercode NIEMALS überschrieben werden falls diese Assembler Funktion weitere externe CALLs durchführt.
Am besten ist es auf die Register EDI,ESI auszuweichen und EBX generell als letzte Wahl zu sehen.

Gruß hagen

Lillebrohr 8. Okt 2003 18:47

Re: Inline ASM
 
Guten Tag,

hmm danke für die schnelle Antwort.
Aber ich habe gemerkt das es funktioniert wenn ich ebx und alle Register sichere.

Code:
asm
pushad
...
popad
end;
Aber bei nonVCL funktioniert das nich. Warum ? Was gibt es sonst noch für Möglichkeiten ???



MfG


LB

negaH 9. Okt 2003 14:52

Re: Inline ASM
 
Zitat:

Aber bei nonVCL funktioniert das nich. Warum ? Was gibt es sonst noch für Möglichkeiten ???
Es gibt in Bezug auf Asembler keinen Unterschied zwischen NonVCL,VCL,MFC,COM usw. Assembler ist Assembler das einzigste was wichtig ist, ausgehend vom Assembler, ist es auf welche Stukturen wie zugegriffen werden muß. Erst dieses Stukturen unterscheiden zwischen NonVCL,VCL usw. Allerdings man glaubt garnicht wie wenig sich die verschiedenen Techniken voneinander unterscheiden.

PUSHAD,POPAD ist eine "schlechte" Idee, da
1.) viel Stack verschwendet wird
2.) eine Kombination aus mehreren PUSH/POP's schneller ist
3.) ebenfalls EBP ge'pusht/ge'popt wird und dieses dadurch einen eventuellen Stackframe zerstören kann


Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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