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?
Was mit nur tun, '* falsch ist (int *) 0x40041014 = 1; '? – Jester
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 –
R0-R3 sind Anrufer-gespeichert von der ARM ABI. – EOF