Delphi-PRAXiS

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.

d3g 18. Apr 2004 16:52

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von Christian Seehase
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.

Du meinst also, dass für jedes Segment ein eigener logischer Adressraum geschaffen wird? Dieses Verhalten müsste doch betriebssystemabhängig sein, da es eigentlich zu Lasten der Performance geht, wenn man logische Adressräume schafft, obwohl man mit dem Register den gesamten linearen bzw. sogar den gesamten physikalischen Adressraum adressieren könnte. Auf 8086 machte das ja noch Sinn, weil man 20 bit für die Adressierung von 1 MB Speicher braucht, das Register aber nur 16 bit breit war, aber heute? Bei Betriebssystemen, die also gar keine Adressraumtrennung zwischen Prozessen machen, könnte man dann auf eigene logische Adressräume für einzelne Register verzichten, oder sehe ich das falsch?

Christian Seehase 18. Apr 2004 22:40

Re: Assembler, kleines Verständisproblem
 
Moin d3g,

Zitat:

Zitat von d3g
könnte man dann auf eigene logische Adressräume für einzelne Register verzichten, oder sehe ich das falsch?

könnte man. ;-)

In Windows laufen ja mehrere Prozesse "gleichzeitig".
Damit die beim Laden aufgelösten Adressen nicht immer neu berechnet werden müssen, wenn auf einen anderen Thread umgeschaltet wird, macht es Sinn einen definierten Nullpunkt zu haben, relativ zu dem dann adressiert werden kann.

Beispiel:
Ein Prozess wird ausgelagert, da er lange nicht benögtigt wurde.
Jetzt ist der phyiskalische Speicher in dem dieser Prozess lag aber von einem anderen belegt worden.
Um jetzt den ausgelagerten Prozess an eine andere physikalische Adresse zu legen müsste man, ohne Segmentregister, erst einmal alle beim Laden aufgelösten Adressen anpassen. Dies lässt sich umgehen, indem einfach die Segementregister für den Prozess auf einen neuen Wert gesetzt werden.
Schon passen die vorberechneten Werte wieder, da sie relativ zum jeweiligen Segmentregister zugreifen.

d3g 19. Apr 2004 17:20

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von Christian Seehase
Um jetzt den ausgelagerten Prozess an eine andere physikalische Adresse zu legen müsste man, ohne Segmentregister, erst einmal alle beim Laden aufgelösten Adressen anpassen. Dies lässt sich umgehen, indem einfach die Segementregister für den Prozess auf einen neuen Wert gesetzt werden.
Schon passen die vorberechneten Werte wieder, da sie relativ zum jeweiligen Segmentregister zugreifen.

Das klingt einleuchtend. Jedoch hat die Segmentierung nichts mit der physikalischen Adresse im Speicher zu tun, dazu ist das Paging zuständig. Ich habe gerade nachgesehen: Linux zum Beispiel übersetzt eine logische Adresse zuerst über die Segmentation Unit in eine lineare und dann über die Paging Unit in eine physikalische Adresse. Pointer wie ebp könnten dann doch gleich eine lineare Adresse beinhalten, denn das würde einen Performancevorteil ergeben, weil die Adresse nicht zuerst noch per Segmentation in eine lineare Adresse umgewandelt werden muss. Eine zusätzliche Angabe des Registers, auf das sie sich bezieht, ist somit unnötig, zumal der gesamte adressierbare Speicher in ein Register passt und es nicht mehr -- wie auf dem 8086 -- eine zusätzliches Register für Adressierung geben muss.

Christian Seehase 19. Apr 2004 19:57

Re: Assembler, kleines Verständisproblem
 
Moin d3g,

Zitat:

Zitat von d3g
...denn das würde einen Performancevorteil ergeben, weil die Adresse nicht zuerst noch per Segmentation in eine lineare Adresse umgewandelt werden muss.

Das erzähl mal Intel ;-)

Zitat:

Zitat von d3g
Eine zusätzliche Angabe des Registers, auf das sie sich bezieht, ist somit unnötig,...

Nur sind in den Opcodes der Befehle die Segmentregister automatisch mit enthalten. Du kommst nicht drum herum.

Wie jetzt ein Betriebssystem die Möglichkeiten eines Prozessors nutzt ist wieder eine andere Sache.

d3g 19. Apr 2004 20:06

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von Christian Seehase
Das erzähl mal Intel ;-)

Was hat Intel damit zu tun? Die Speicherverwaltung ist doch einzig und allein Sache des Betriebssystems.

Zitat:

Zitat von Christian Seehase
Nur sind in den Opcodes der Befehle die Segmentregister automatisch mit enthalten. Du kommst nicht drum herum.

Wirklich? Warum braucht das Betriebssystem dann noch eine Speicherverwaltung, wenn der Prozessor Segmentation und Paging von selbst macht?

:wiejetzt:

Christian Seehase 19. Apr 2004 20:15

Re: Assembler, kleines Verständisproblem
 
Moin d3g,

Zitat:

Zitat von d3g
Die Speicherverwaltung ist doch einzig und allein Sache des Betriebssystems.

Dennoch ist jedes Betriebssystem für die Adressbildung auf die Möglichkeiten der zugrunde liegenden CPU angewiesen.

d3g 19. Apr 2004 20:23

Re: Assembler, kleines Verständisproblem
 
Zitat:

Zitat von Christian Seehase
Dennoch ist jedes Betriebssystem für die Adressbildung auf die Möglichkeiten der zugrunde liegenden CPU angewiesen.

Nun ja, die CPU sollte doch bei Angabe einer physikalischen Adresse auf diese zugreifen können. Wenn es eine CPU gibt, die das nicht kann, dann möchte ich wissen, wie das Betriebssystem Paging vollzieht. Schließlich ist das Resultat des Pagings eine physikalische Adresse. Wenn die CPU nun auf den Speicher anhand physikalischer Adressen zugreift, ist die eiegentliche Speicherverwaltung doch komplett in der Hand des Betriebssystems. Und an dieser Stelle stellt sich für mich die Frage: warum Pointer in einem logischen Adressraum verwenden, wenn man sie doch gleich im linearen Adressraum verwenden könnte?


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