2013-11-23 71 views
2

我想知道如何我可以從堆棧中的變量POP並將其存儲在一個寄存器。 例如:ARM彙編,POP堆棧和存儲在寄存器

asm(" MOV R5, #10"); 
asm ("MOV R6, #20"); 
asm("PUSH {R5,R6}"); 

我現在想POP從堆棧變量和R6值存儲在R5和正相反。 我已經搜索了ARM站點(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Babefbce.html),但我找不到有價值的答案。 我希望有人能幫助我。

編輯:

我想這將做的工作:

asm("MOV R5, #10"); 
    asm("MOV R6, #20"); 
    asm("PUSH {R5,R6}"); 
    asm("POP {R5,R6}"); 

但根據我調試寄存器不改變。

+0

你想交換它們。嘗試單獨推送和彈出它們。 – auselen

+0

彈出時存儲的值在哪裏? –

+1

添加到列表中的寄存器,如pop {r4,r5} – auselen

回答

2

您遇到的問題是,當在PUSHPOP中指定了多個寄存器時,它們總是按數字順序推入或彈出。它們在指令中指定的順序無關緊要。以這種方式強制寄存器內容交換的唯一方法是在兩個單獨的指令中分別執行兩個寄存器中的一個操作(push或pop)。您將需要檢查PUSHPOP指令的文檔,以確定處理多個寄存器時使用的默認順序,然後使用兩條單​​獨的指令故意排除該順序。

2

push和pop都是僞指令。

它們被轉換爲STM和LDM分別在彙編時,根據不同的堆疊型(滿降序被解因子標準)的後綴:

  • 滿降序:STMDB,LDMIA
  • 滿升:stmib,ldmda
  • 空降:stmda,ldmib
  • 空遞增:STMIA,ldmdb

一個非常簡單的規則適用於:較低編號的寄存器加載/存儲從/到較低地址的值。

不可能改變它的工作方式。如果你想要把不同的順序值比規則說以上,無論是排序前推,或在單獨訂購他們推你看到它適合像:

push {r6} 
push {r5} 

老實說,我不明白這樣做的任何好理由。如果你絕對需要這種「排序」,首先問自己,你是否沒有做錯什麼。

+1

它們是Thumb模式下的專用指令。 –

+1

你有一點。但是誰不喜歡編寫Thumb代碼? –

+1

是的,我理解PUSH和POP方法的概念謝謝!但我沒有看到的是一旦POPPED它們被保存的地方。這對我來說很模糊。這樣做的目的是一個小實驗,並熟悉CORTEX處理器和我用於我的大學的STM32。 –

2
asm("MOVS R5, #10"); 
    asm("MOVS R6, #20"); 

    asm("PUSH {R5,R6}"); 
    asm("POP {R6}"); 
    asm("POP {R5}"); 

我現在已經解決了這個問題,我對此是完全陌生的,而且答案結果非常簡單。 感謝大家的時間。