Frage zu Assembler

Gast #3985408
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
Gast #3985483
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
#3985512
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren