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


von Peter P. (uncle-sam7)


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

von Torsten K. (ago)


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 :)

von Peter P. (uncle-sam7)


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?

von (prx) A. K. (prx)


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.

von Peter (Gast)


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.dui0068b/Bcfihdhj.html#id2765834

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

Viele Grüße,
Peter

von (prx) A. K. (prx)


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."

von (prx) A. K. (prx)


Lesenswert?

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

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

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

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

--
Marcus

von (prx) A. K. (prx)


Lesenswert?

Marcus Harnisch schrieb:

> Nein, nur besser versteckt.

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

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.