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
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 :)
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?
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.
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
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."
PS: Jenseits von ARMv5 ist das Verhalten offenbar definiert, d.h. bei den Cortexen darf man das.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.