2017-05-16 68 views
1

我正試圖編寫一個函數,它將重置我的Cortex M3平臺上的GPIO0。我正在使用Keil編譯器。 目標是將「1」寫入地址0x40041014。我寫了一個代碼:不能使用PUSH彙編指令

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

它的工作,但我有一個問題,我的函數覆蓋R0和R1之前的值。我試圖把它們堆,然後彈回,但是當我添加

PUSH {R0, R1} 

到功能開始我得到一個錯誤:

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

我在做什麼錯?

+3

出了什麼問題只是在做'*爲(int *)0x40041014 = 1; '? – Jester

+0

那麼問題是,這個代碼轉換成: MOVS R0,#0×01 LDR R1,[PC,#740] STR R0,[R1,#0×14] BX LR 和一些很奇怪的原因,我可以不使用pc有 –

+0

R0-R3由ARM ABI調用者保存。 – EOF

回答

2

在ARM內聯彙編中,寄存器R13,R14和R15 may not be accessed。如果你想這樣做,你必須在彙編中編寫整個程序,而不是使用內聯彙編。

0

雖然PUSH指令不直接訪問或修改R13,但它確實間接修改 - 這實際上被保證以引起相同的功能,用於編譯器生成的代碼中的問題。

如果這確實是編譯器拒絕彙編你的指令的原因(當然,你自己承擔風險),那麼它發出的錯誤信息措辭不當。

不幸的是,ARMCC錯誤消息文檔沒有提供這方面的信息。

(正如其他人所指出的那樣,你不需要這麼寫任何彙編,當然不是任何保存寄存器的代碼。)