私はCortex M3プラットフォームでGPIO0をリセットする関数を記述しようとしています。私はKeilコンパイラを使用しています。 目標はアドレス0x40041014に "1"を書き込むことです。私はコードを書いた:PUSHアセンブラ命令を使用できません
static void resetGPIO0()
{
__asm
{
MOV R0, #0x01
MOV R1, #0x1000
MOVT R1, #0x4004
STR R0, [R1, #0x14]
}
}
をし、それが働いていますが、私は私の関数はR0とR1に前にあった値をオーバーライドするという問題があります。私はスタックしてから戻ってPOPにプッシュしようとしたが、私は、関数の先頭に
PUSH {R0, R1}
を追加するとき、私はエラーを取得:
1161: Cannot directly modify the stack pointer SP (r13).
は私が間違って何をしているのですか?
'*(int型*)0x40041014 = 1; '? – Jester
さて、問題は、このコードはに変換されていることである:[R1、#0x14の] BX LR と私ができるいくつかの本当に奇妙な理由のために MOVS R0、#0x01を LDR R1、[PC、#740] STR R0、そこにPCを使用しないでください –
R0-R3はARM ABIによって呼び出し元に保存されます。 – EOF