Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler, kleines Verständisproblem (https://www.delphipraxis.net/20392-assembler-kleines-verstaendisproblem.html)

shareholder 17. Apr 2004 09:09


Assembler, kleines Verständisproblem
 
kann mich mal jmd. aufklären und mir bitte sagen,
was folgende auschnitt aus befehlszeilen zu bedeuten haben:

1.)
dword ptr [ebp-08]

2.)
byte ptr [ebp+edx-71]

ptr ist ja sicherlich der pointer, aber was ist [ebp-08] bzw. [ebp+edx-71] ?
ist das ne bestimmte adresse ?

außerdem:

ich konnte in meinem buch nicht's über :

eax
edx
edi

lesen, was bedeutet das ?

d3g 17. Apr 2004 10:33

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von shareholder
kann mich mal jmd. aufklären und mir bitte sagen,
was folgende auschnitt aus befehlszeilen zu bedeuten haben:

[ebp-08] ist der der Inhalt der Speicherstelle "Inhalt von ebp minus 8". Wenn in ebp z.b. 0xDEADBEEF ist, dann ist ebp-8 0xDEADBEE7. Wenn an der Speicherstelle 0xDEADBEE7 nun 0xAB steht, ist [ebp-08] 0xAB. Analog gilt das gleiche für [ebp+edx-71].

Zitat:

Zitat von shareholder
ich konnte in meinem buch nicht's über :

eax
edx
edi

Die gleichen Register wie ax, dx und di, nur 32-bittig. mit ax, dx und di greifst du in 32-bit-Assembler auf den niederwertigen Teil von eax, edx und edi zu.

shareholder 17. Apr 2004 12:02

Re: Assembler, kleines Verständisproblem
 
ok, also den ersten teil, hab ich verstanden ! danke

aber den 2. net so richtig :(
kannst du bitte nochmal irgendwie anders erklären ? :gruebel:

wäre klasse ! :angle:

Leuselator 17. Apr 2004 12:31

Re: Assembler, kleines Verständisproblem
 
das "e" in "eax" usw. steht für "enhanced" also "Erweitert". Kam beim Übergang von 16bit auf 32bit Prozessoren in's Spiel.
Das nunmehr 32bit breite Register "AX" sprach man nunmehr mit "EAX" an. Verwendete man nur "AX", dann lieferte das einem nur die letzten (niederwertigen) 16 bit des 32bit-Registers zurück.
Gruß

shareholder 17. Apr 2004 12:54

Re: Assembler, kleines Verständisproblem
 
ah danke, und schon wieder etwas dazugelernt ! :)

letzte frage ersteinmal :

kennt ihr eine gute seite, wo die schiebe - und rotationsbefehle ausführlich und einfach erklärt sind, ich kann den beschreibungen in meinem buch nicht nachvollziehen und google bringt auch nix brauchbares. :(

Christian Seehase 17. Apr 2004 15:58

Re: Assembler, kleines Verständisproblem
 
Moin Shareholder,

da die von Dir angegebenen Ausdrücke kaum alleine stehen, gehe ich mal davon aus, dass es, z.B.,
Delphi-Quellcode:
mov EAX,DWORD PTR [EPB-8]
heisst.

Das würde bedeuten, dass die zweite lokale Variable nach EAX geladen wird.
Entweder der Wert selber (wenn es sich z.B. um eine Variable vom Typ integer handelt), oder aber deren Adresse (wenn es z.B. ein Objekt ist), wird aus der Adresse geladen, auf die der Inhalt von EBP-8 zeigt.

Vor der Zeile steht bestimmt noch
Delphi-Quellcode:
push EBP
mov EBP,ESP
eventuell auch noch mehr.

BTW: Stand da wirklich nur DWORD PTR [EBP-8] und nicht etwas DWORD PTR SS:[EBP-8]?

d3g 17. Apr 2004 17:19

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von Christian Seehase
BTW: Stand da wirklich nur DWORD PTR [EBP-8] und nicht etwas DWORD PTR SS:[EBP-8]?

ebp reicht doch, um 4 GB Speicher zu adressieren, warum sollte man dazu 64 bit benutzen?

shareholder 17. Apr 2004 17:38

Re: Assembler, kleines Verständisproblem
 
hi Christian Seehase,
ne, der code stimmt schon. d3g hat's ja erklärt.

frage: mov eax, byte ptr [ebp+edx-11]

angenommen ebp=66 & edx=45, dann liegt nach der durchführung des befehls der wert 100
im eax ?

hab ich das richtig verstanden ?

dizzy 17. Apr 2004 18:02

Re: Assembler, kleines Verständisproblem
 
Nein.

Wenn dort stünde:
Code:
mov eax, byte ptr ebp+edx-11
also ohne die eckigen Klammern, DANN wäre deine Folgerung richtig. Die Klammern sind in Assembler die Dereferenzierungs-Operatoren (geiles Wort!), dass heisst es würde in EAX der Wert stehen, der an der Stelle 100 im Speicher steht. Das kann irgendwas sein. Zusätzlich wird dieser Wert nach "Byte" gecastet ("byte ptr" heisst, dass der Pointer auf 1 Byte zeigen soll).


gruss,
dizzy (der auch in seinen ersten Zügen mit asm liegt ;) )

Christian Seehase 17. Apr 2004 23:31

Re: Assembler, kleines Verständisproblem
 
Moin d3g,

es ist zwar richtig, dass man mit einem 32 Bit grossen Register 4GB Adressen erreichen kann, dennoch ist in den Opcodes der Befehle auch ein Segmentregister (CS, DS, ES, FS, GS, SS) mit kodiert, dessen Inhalt mit zur Adressbildung herangezogen wird.
Beispiel:

EBP = 48
DS = 100
FS = 200

Dann würde man bei
Code:
mov EAX,DWORD PTR [color=red]DS[/color]:[EBP-8]
den Inhalt des DWORD ab Adresse 140 nach EAX holen, und bei
Code:
mov EAX,DWORD PTR [color=red]FS[/color]:[EBP-8]
ab Adresse 240

Wenn also die Segmentregister nicht den gleichen Inhalt haben, spielt deren Angabe durchaus eine Rolle.


@Shareholder:

Zitat:

Zitat von shareholder
frage: mov eax, byte ptr [ebp+edx-11]

angenommen ebp=66 & edx=45, dann liegt nach der durchführung des befehls der wert 100
im eax ?

Ich kann mir nicht vorstellen, dass Du die Zeile in einem Programm gesehen hast.
Vermutlich meinst Du
mov al,byte ptr[ebp+edx-11]

um Dein Beispielergebnis zu erreichen müsstest Du den Befehl LEA (Load Effective Address) nehmen, und das Segmentregister müsste den Wert 0 haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr.
Seite 1 von 2  1 2      

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