Forum: Mikrocontroller und Digitale Elektronik Thumb / ARM ISA - Verständnisfrage


von ARMateur (Gast)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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.

von ARMateur (Gast)


Lesenswert?

Hi Jim,

vielen Dank! Das war hilfreich!
Zu Bauforms Einwurf maße ich mir noch keine Meinung an. ;-)

VG
Hannes

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von ARMateur (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.