Ü3,HA1: indirekte adressierung -> zugriff auf array

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von FGB »

Hi zusammen,
ich habe gerade das Problem, das ich nach dem Sprung in mein Unterprogramm nicht weiß, wie ich genau auf das Feld *x* zugreifen kann.

Beispiel:

Code: Alles auswählen

data: 
        data_items:	.long 8, 6, 7, 5, 9, 2, 10, 1, 3, 4
main:
        leal data_items, %edi # adresse von data_items in edi gespeichert
	pushl %edi # edit weggesichert
       call .UP
.UP  # Unterprogramm
	movl 8(%esp),%edi  # adresse von data_items in edi speichern
	movl (%edi), %ebx  # komplettes Feld-Array in ebx speichern
	
	movl %ebx(,$1,4), %eax # theoretisch auf den 2. Wert des Arrays zugreiffen und in eax speichert

Als Fehlermeldung bekomme ich immer: error: expected `,'
Diese Fehlermeldung referenziert auf die Zeile, auf der ich versuche auf Feld x zuzugreifen.

Wie kann ich auf ein Feld zugreifen, welches ich über eine Adresse referenziert habe?

Dank euch udn viele Grüße
Felix

LucasR
Kernelcompilierer
Kernelcompilierer
Beiträge: 474
Registriert: 9. Jun 2009 09:55

Re: Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von LucasR »

Tipp: Im Moodle-Forum gibts Support auch von offizieller Seite.

nicolas
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 29. Jan 2010 12:56

Re: Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von nicolas »

Code: Alles auswählen

	movl (%ebx,$1,4), %eax # theoretisch auf den 2. Wert des Arrays zugreiffen und in eax speichert
sollte funktionieren. Siehe z.B.
http://en.wikibooks.org/wiki/X86_Assemb ... and_syntax.
Wobei ich mir jetzt gerade nicht sicher bin, ob du nicht statt dem $1 ein Register angeben musst.

dschneid
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 271
Registriert: 14. Dez 2009 00:56

Re: Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von dschneid »

Ja, die beiden ersten Werte in der Klammer müssen immer Register sein. Einen Immediate-Wert kann man nur vor die Klammer schreiben.

Die allgemeine Form ist: Imm(Base, Index, Scale), wobei Imm und Scale immer Immediates sind, Base und Index dagegen immer Register. Die Adresse wir dann berechnet durch die Formel Imm + Base + (Index * Scale).

Wenn man hintere Teile aus der Klammer weglässt (also Scale, oder Index und Scale), dann lässt man auch die Kommas weg. Beispiel: Nur Imm und Base hat das Format Imm(Base), das auch in der Vorlesung zum Zugriff auf den Stack häufig vorkam. Lässt man allerdings Base weg, muss man trotzdem das erste Komma noch hinschreiben, weil sonst nicht eindeutig wäre, ob die zwei Angaben in der Klammer Index und Scale oder Base und Index bedeuten. Den Index wegzulassen, aber einen Scale anzugeben, ergäbe keinen Sinn und das kann man daher nicht machen. Wenn man aber nur den Scale weglässt, wird der Scale-Faktor implizit als 1 angenommen.

Also mal auf das Problem hier angewandt: Wenn du z.B. in %esi die Basisadresse des Arrays stehen hast und in %ecx den Index, dann kannst du mit (%esi,%ecx,4) auf das Array zugreifen. Wenn du (weniger allgemein) auf das zweite Element des Arrays zugreifen willst, dann schreibst du 4(%esi).

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

Re: Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von FGB »

Hi,

danke für die ausführliche Erklärung! Werde es nachher gleich mal ausprobieren.

Grüße

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

Re: Ü3,HA1: indirekte adressierung -> zugriff auf array

Beitrag von FGB »

Hat funktioniert.

Danke nochmal dafür!

Antworten

Zurück zu „Archiv“