mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7: ldrb r5, [r5], #1 unvorhersehbar?


Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

mein Assembler warnt mich gerade, dass
ldrb r5, [r5], #1
ein unvorhersagbares Verhalten liefern würde. Ist da was dran ;-) ?

(Sun Jan 16 00:10:33 2011: Warning: UNPREDICTABLE behaviour: Addr: 
0x00000198  instr: LDRB   opcode: 0xE4D55001)

mfg
Peter

Autor: Torsten K. (ago)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, klingt logisch

Du willst das Ergebnis des LDRB wieder nach R5 schreiben. Gleichzeitig 
erfolgt ein Post-Increment des Adresspointers (R5) um 1.

Soll nun R5 mit dem Byte geladen werden, oder mit der neuen alten 
Adresse + 1? :-)

Lösung: unterschiedliche Register nutzen, oder das +1 weglassen :)

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Torsten,

Danke für Deine Antwort.

> Du willst das Ergebnis des LDRB wieder nach R5 schreiben. Gleichzeitig
> erfolgt ein Post-Increment des Adresspointers (R5) um 1.

hmm, ja, genau. Post-Increment. Hätte ich jetzt als Increment NACH der 
Aktion gedacht. Hab jetzt sowieso zwangsweise ein anderes Zielregister 
nehmen müssen.

Ist das jetzt nur ne Sache vom Assembler, oder wüsste der AT91SAM7S256 
wirklich nicht, was er da machen soll? Wo kann man das genau lesen, dass 
man das so nicht machen darf?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Pippinger schrieb:

> Ist das jetzt nur ne Sache vom Assembler, oder wüsste der AT91SAM7S256
> wirklich nicht, was er da machen soll?

Der weiss schon was er tun soll, nämlich das was sich als Nebeneffekt 
der internen Mechanik implizit ergibt. Aber erstens kann sich das von 
einem Core zum nächsten ändern, zweitens können Umstände wie 
irgendwelche Exeptions, Codierungsoptionen im Befehl oder 
Registerverwendung im Folgebefehl darauf Einfluss haben.

Im Klartext: Du darfst das nicht machen. Punkt.

> Wo kann man das genau lesen, dass
> man das so nicht machen darf?

In der offiziellen Befehlssatzbeschreibung, dem ARM Architecture 
Reference Manual. Wahrscheinlich auch in der Online-Doku auf arm.com.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ja gerne lernen :-) Dazu gehört ja auch, wo ich die passenden 
Informationen finde.

Habe eben auf der ARM-Seite folgendes gefunden:

http://infocenter.arm.com/help/topic/com.arm.doc.d...

Da steht doch eigentlich nicht, dass man das so nicht machen darf, oder?

Viele Grüße,
Peter

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein?

"Rn must not be the same as Rd, if the instruction:
- is pre-indexed with writeback (the ! suffix)
- is post-indexed   [<-- A.K.]
- uses the T suffix."

Die richte Adresse dafür ist übrigens nicht die von dir angegebene 
Seite, sondern das "ARMv5 Architecture Reference Manual" (PDF):

"Operand restrictions
If <addressing_mode> specifies base register write-back, and the same 
register is specified for <Rd> and <Rn>, the results are UNPREDICTABLE."

und

"UNPREDICTABLE: Means the result of an instruction cannot be relied 
upon. UNPREDICTABLE instructions or results must not represent security 
holes. UNPREDICTABLE instructions must not halt or hang the processor, 
or any parts of the system."

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Jenseits von ARMv5 ist das Verhalten offenbar definiert, d.h. bei 
den Cortexen darf man das.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> PS: Jenseits von ARMv5 ist das Verhalten offenbar definiert,

Nein, nur besser versteckt.
if (wback && n == t) || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE;

Wobei n die Nummer des Basisregisters ist, und t die Nummer des 
Zielregisters.

--
Marcus

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcus Harnisch schrieb:

> Nein, nur besser versteckt.

Nö, ich war in der falschen Zeile. Bei Rn<>Rm, statt Rn<>Rt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.