Forum: Mikrocontroller und Digitale Elektronik Frage zu Assembler


von LM (Gast)


Lesenswert?

Hallo,

ich sitze momentan vor einem kleinen Assembler Ausschnitt und hänge 
etwas fest. Es handelt sich um einen Cortex M3 Chip. Der Ausschnitt ist 
folgender:
1
          .text
2
PADATR:   .word. 0x400043FC
3
          ...
4
          LDR   R0,PADATR
5
          MOV   R1,#0x80
6
          LDRB  R2,[R0]
7
          ...
8
          .end

Bedeutet die Zeile "LDR...", dass er in Register 0 die Adresse 
0x400043FC lädt? Dann würde er ja in der Zeile "LDRB..." der Wert an der 
Adresse 0x400043FC in Register 2 geladen.

Oder bin ich total auf dem Holzweg?

Viele Grüße
LM

von Stefan (Gast)


Lesenswert?

Nein der Wert von PADATR wird als Adresse interpretiert. und bei LDRB 
wird der Wert der hinter der Adresse steckt in R2 geschrieben

von Stefan (Gast)


Lesenswert?

Also insofern DOCH :D..du hast recht. Hab die erste Zeile .word. 
überlesen

von LM (Gast)


Lesenswert?

Jetzt bin ich verwirrt... :D

Viele Grüße
LM

von Stefan F. (Gast)


Lesenswert?

LDR Lädt den Wert einer Speicherzelle, deren Adresse wird als Argument 
zu LDR angegeben.

Das gegenstück wäre Load-Immediate. ich weiß nicht, wie das in der 
Sprache dieses Chips abgekürzt wird. Vielleicht LDI.

von LM (Gast)


Lesenswert?

Also beispielsweise:

An 0x400043FC ist PORTA im Controller adressiert und PORTA hat z.B. als 
Inhalt 0x0000000F.

Dann steht mit dem Ausschnitt oben also 0x0000000F in R2? (Annahme: Der 
Wert an der Adresse 0x400043FC (-> LDR R0, PADATR) wird per LDRB in R2 
geladen).

Ich hoffe, ich habe es nun verstanden...

Viele Grüße
LM

von uwe (Gast)


Lesenswert?

ARMs können keinen 32Bit Immediate

von Sascha (Gast)


Lesenswert?

Hallo,
also LDR   R0,PADATR gibt es eigentlich nicht, das müsste folgender 
maßen sein.

Variante 1: ADR R0,PADATR oder ADRL R0,PADATR dies ist ein pseudo Befehl 
der als ADD R0,PC+/-Offset übersetzt wird.

Variante 2: LDR R0,=PADATR hier wird die Adresse von PADATR im 
CODE-Bereich meist nach LTORG angelegt und über LDR R0,PC+/-Offset 
geladen.

In beiden Beispielen steht dann in R0 die Adresse von PADATR dann drin.
Mit LDRB R2,[R0] wird dann nur ein Byte (8 Bit) ins R2 geladen. Die 
anderen Bits in R2 (Bit 8-31) sind null.

LDR = 32 Bit laden
STR = 32 Bit speichern
LDRB = 8 Bit laden
STRB = 8 Bit speichern
LDRH = 16 Bit laden
STRH = 16 Bit speichern

Das ganze geht dann auch noch mit Vorzeichenerweiterung auf 32 Bit wenn 
ein S angehängt wird, was soviel wie sign extension heiß.

Gruß Sascha

von Peter D. (peda)


Lesenswert?

LM schrieb:
> Jetzt bin ich verwirrt... :D

Der ARM kann keine 64Bit Befehle und daher kann man in einem Befehl 
keinen 32Bit-Wert übergeben.
Daher benutzt man einen Trick und schreibt den 32Bit-Wert in den Flash 
in die Nähe des Befehls. Der Befehl kriegt nun nur die relative Adresse 
des Wertes übergeben. Dafür reichen dann weniger Bits aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.