Hallo,
ich bemerke hier ein komisches Problem. Benutze den neuesten
arm-none-eabi-gcc. Beim Eintritt in eine Funktion wird ja jeweils was
auf den Stack gelegt:
push {r7, lr}
....
pop {r7, pc}
Ich habe festgestellt, dass das bei mir irgendwie nicht funktioniert!
Wenn ich den Code im Debugger verfolge und an ein solches push / pop
Statement komme, dann passiert einfach gar nichts.
Beispiel:
SP zeigt auf Adresse 0x20001000
R7 beinhaltet den Wert 0xa5a5
ich führe ein push {r7} aus, nach meinem dafürhalten müsste jetzt der SP
um 4 dekrementiert werden und an Adresse 0x20000ffc müsste der Wert
0xa5a5 abgelegt werden. Richtig?
Wenn ich im Cortex M4 Generic User Guide von ARM nachschaue, dann heisst
es dort "PUSH and POP are synonyms for STMDB and LDMIA." Das heisst doch
dass
push {r7}
den gleichen Opcode ergeben müsste wie
stmdb {r7}
oder? Macht mein GCC hier aber nicht. Was könnte da das Problem sein?
ich benutze -mcpu=cortex-m4 und -mthumb zum Compilieren.
Auszug aus der Disassembly:
1 | asm("push {r7}");
|
2 | 200002c0: b480 push {r7}
|
3 | asm("stmdb sp!, {r7}");
|
4 | 200002c2: f84d 7d04 str.w r7, [sp, #-4]!
|
man erkennt gut, dass push anders übersetzt wird, als stmdb, obwohl es
dieselben Instruktionen sein sollen, gemäss ARM Manual. Mein Prozessor
macht bei STMDB genau das richtige, er dekrementiert den SP und
speichert R7 an dieser Adresse; bei PUSH wird nur SP dekrementiert und
es wird nichts gespeichert.
Es handelt sich um einen Cortex M4F. (Discovery Board)