Hi zusammen, ich habe vor einiger Zeit angefangen mit AVRs zu spielen und beginne nun mich mit ARM zu beschäftigen. Dazu lese ich gerade The Definitive Guide to ARM. Ich habe eine Verständnisfrage zur ISA über die ich vielleicht auch bei AVR gestolpert wäre wenn ich so tief eingestiegen wäre. Es geht um die MOV bzw. MOVS Instruktionen. Ich lese, dass der Unterschied darin besteht, das MOVS gleichzeitig die Flags im APSR aktualisiert also (N, Z, C) im Wesentlichen. MOV schreibt doch nur den Wert eines Register oder ein Literal in einen anderen Register. Wie kann dabei eine Änderung im PSR auftreten? Versteht mich nicht falsch, ich will nicht in erster Linie in ASM schreiben. Die ersten Programmierversuche erfolgen in C, aber ich habe an dieser Stelle das Gefühl, etwas grundsätzlich nich richtig Verstanden zu haben. Ich hoffe ihr könnt mir hier etwas auf die Sprünge helfen. Viele Grüße Hannes
ARMateur schrieb: > Wie kann > dabei eine Änderung im PSR auftreten? Bei MOV kann man das Source Register shiften, ARM nennt das "Flexible second operand". Dabei kann das C Flag gesetzt werden. Die N und Z Flags beziehen sich auf den Wert im Ergebnis.
Eigentlich sollte fast jeder Befehl (gerade auch load und store) diese Flags setzen. Ich fände das total praktisch, weil man auf die Art ein if() halb geschenkt bekommt. Andererseits würde Multi-Word-Arithmetik etwas mühsamer, man kann nicht alles auf einmal haben.
Hi Jim, vielen Dank! Das war hilfreich! Zu Bauforms Einwurf maße ich mir noch keine Meinung an. ;-) VG Hannes
ARMateur schrieb: > Wie kann dabei eine Änderung im PSR auftreten? Indem der ins Ziel geschriebene Wert geprüft wird. In frühen Implementierungen von ARM ist MOV ein ALU-Befehl wie ADD und der Wert passiert also die ALU. Im nativen Befehlssatz ist bei ALU-Befehlen meist wählbar, ob die Flags gesetzt werden.
Bauform B. schrieb: > Eigentlich sollte fast jeder Befehl (gerade auch load und store) diese > Flags setzen. Ich fände das total praktisch, weil man auf die Art ein > if() halb geschenkt bekommt. Andererseits würde Multi-Word-Arithmetik > etwas mühsamer, man kann nicht alles auf einmal haben. Auf nicht spekulativen superskalaren Cores wie dem Cortex M7 wird es zur Performance-Bremse. Bei solchen Cores ist es sehr nützlich, wenn man zwischen einen Befehl und einem dessen Result nutzenden Befehl mindestens einen anderen Befehl legen kann, der damit nichts zu tun hat. Bei den normalen Registern ist das einfach, bei den Flags hingegen nur, wenn nicht alle Befehle sie setzen.
Das ganze ist auch ausführlich dokumentiert im "ARMv7M Architecture Reference Manual" auf S. 291-295. Dort ist zu sehen, dass MOV auch die Flags setzen kann, wenn überhaupt nicht geshiftet wird - in Abhängigkeit vom Eingabewert.
Danke, es wird klarer. Ich konnte es inzwischen nachvollziehen. z.B.nach Ausführung folgenden Beispiels ist Z = 1
1 | MOVS r0, #0x0 |
VG Hannes
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.