Warum kann ich diesen Assemblercode nicht kompilieren?

Beim Zusammenbau des Codes erhalte ich den Fehler: fpu.s(13): error: A1240E: Immediate value can not be used with this operation

AREA PGRM, CODE, READONLY
ENTRY
EXPORT __main
__main
    LDR R0,=0XE000ED88
    LDR R1,[R0]
    ORR R1,R1,#(0xF << 20)
    STR R1,[R0]
    dsb



    VMOV.F32 S7, #0x419c0000
    VMOV.F32 S8, #0X41B40000
    VADD.F32 S9,S7,S8

LOOP    B LOOP
    END
Ich betrachte diese Frage als Off-Topic, da sie ausschließlich programmierungsbezogen ist, egal welche Plattform verwendet wird.
Seien Sie konsistent mit Ihren Hexadezimalzahlen. Verwenden Sie #0xFFFFFFFF statt manchmal #0XFFFFFFFF. Sie können den Compiler damit verwechseln, dass er inkonsistent ist.
@ Sparky256, wird der Compiler verwirrt? Ich dachte, es lehnt die Syntax für Konstanten entweder vollständig ab oder akzeptiert sie, und diese sehen legal genug aus.

Antworten (1)

In VMOV erwartet das F32-Format das folgende Argument als unmittelbaren Wert:

Jede Zahl, die ausgedrückt werden kann als ± N × 2 R , wobei n und r ganze Zahlen sind, 16 <= n <= 31, 0 <= r <= 7.

Sie haben die folgenden unmittelbaren Werte:

0x 419 C 0000 = 4199 × 2 18 N = 4199 R = 18
Und
0x 41 B 40000 = 4205 × 2 18 N = 4205 R = 18

In beiden Anweisungen liegen die unmittelbaren Werte deutlich außerhalb des erwarteten Bereichs. Diese Parameter sollten Sie vorher skalieren.

Das war auch mein Gedanke, aber im Benutzerhandbuch für den Cortex-m4 ist diese Einschränkung nicht aufgeführt. infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/…
@ Colin__s Ich bin mir nicht sicher, ob ich folge, die gleiche Beschreibung der Wertebereiche befindet sich in dem von Ihnen angegebenen Link. Wollen Sie damit sagen, dass der Monteur die Augen davor verschließen sollte?
Bitte überprüfen Sie den Link noch einmal, ich hatte das Falsche in meiner Zwischenablage, als ich das erste Mal kommentierte. Im Cortex m4-Handbuch steht "Einschränkungen Es gibt keine Einschränkungen."
@ Colin__s In der Tat scheint dies der Fall zu sein. Wenn Wertebereiche nicht schuld sind, wäre meine nächste Vermutung eine falsche Zielkonfiguration.
@Vincente Ich habe den simulierten Prozessorkern ARMCM4_FP verwendet.
@Colin__s Dass "keine Einschränkungen" gilt für wann, nicht für die Anzahl der Bits, die zum Codieren eines unmittelbaren Werts verwendet werden.