2017-05-16 7 views
1

Ich versuche, eine Funktion schreiben, die GPIO0 auf meiner Cortex M3-Plattform zurückgesetzt wird. Ich benutze den Keil Compiler. Das Ziel ist, "1" in Adresse 0x40041014 zu schreiben. Ich schrieb einen Code:Kann PUSH Assembler-Anweisung nicht verwenden

static void resetGPIO0() 
{ 
    __asm 
    { 
    MOV R0, #0x01 
    MOV R1, #0x1000 
    MOVT R1, #0x4004 
    STR R0, [R1, #0x14] 
    } 
} 

und es funktioniert, aber ich habe ein Problem, dass meine Funktionen Werte außer Kraft gesetzt, die vor dem in R0 und R1 waren. Ich versuchte, sie PUSH zu stapeln und dann POP zurück, aber wenn ich

PUSH {R0, R1} 

zu Beginn der Funktion hinzuzufügen bekomme ich einen Fehler:

1161: Cannot directly modify the stack pointer SP (r13).

Was mache ich falsch?

+3

Was mit nur tun, '* falsch ist (int *) 0x40041014 = 1; '? – Jester

+0

Nun das Problem ist, dass dieser Code in umgewandelt wird: MOVS R0, # 0x01 LDR R1, [pc, # 740] STR R0, [R1, # 0x14] BX LR und für einige wirklich seltsame Gründe kann ich 't verwenden pc dort –

+0

R0-R3 sind Anrufer-gespeichert von der ARM ABI. – EOF

Antwort

2

Bei ARM-Inline-Montage sind die Register R13, R14 und R15 may not be accessed. Wenn Sie das tun möchten, müssen Sie die gesamte Prozedur in Assembly schreiben, anstatt Inline-Assembly zu verwenden.

0

Während die PUSH Anweisung nicht direkt oder R13 ändern zugreifen, es tut indirekt es ändern - was praktisch garantiert wird, um Probleme für Compiler generierten Code in der gleichen Funktion zu verursachen.

Wenn das tatsächlich der Grund ist, warum der Compiler es ablehnt, Ihre - an und für sich vollkommen legitime - Anweisung zusammenzustellen (die Sie natürlich auf eigene Gefahr verwenden), dann ist die Fehlermeldung, die sie aussendet, schlecht formuliert .

Leider wirft die ARMCC-Fehlermeldung keinen Hinweis darauf.

(Wie andere haben darauf hingewiesen, Sie brauchen keine Assembler sowieso zu schreiben, und schon gar nicht irgendein Register Spar Code.)

Verwandte Themen