Frage zu Assembler

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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.