2013-10-12 48 views
5

我目前正在學習一個類的ARM程序集,並遇到了需要使用「數組」的問題。我知道在ARM中沒有這樣的數組,所以我必須分配空間並將其視爲數組。我有兩個問題。如何在ARM程序集中正確創建數組?

  1. 我是否正確地向數組添加新的值,或者我只是覆蓋以前的值?如果我重寫了這些值,我該如何去添加新的值?
  2. 我該如何去循環數組的不同值?我知道我必須使用loop:,但不知道如何使用它來訪問不同的「索引」。

到目前爲止,這正是我從閱讀ARM文檔中得到的,正如我從在線資源收集的。

 .equ SWI_Exit, 0x11 

     .text 
     .global _start 

_start: .global _start 
     .global main 

     b  main 

main: 
     ldr  R0, =MyArray 
     mov  R1, #42 
     str  R1, [R0], #4 
     mov  R1, #43 
     str  R1, [R0], #4 
     swi  SWI_Exit 

MyArray: .skip 20 * 4 
     .end 

作爲一個方面說明,我使用ARMSim#的要求我的教授,所以由GNU工具公認的一些命令將不會被ARMSim#識別,或者至少我認爲是這樣的。如果我錯了,請糾正我。

+1

爲什麼要投票?是的,這與家庭作業有部分關係,但我可以看到這些信息對其他人有用,我不問如何做我的任務。 – allejo

+0

如果你想這樣說,沒有任何處理器家族中的數組不是隻有arm。數組實際上並不存在,它們只是從某處開始的一塊內存。許多指令集,絕對支持,支持寄存器偏移量尋址模式,使您可以獲得純粹的陣列感覺。我會小心地做出你未來的發言。 –

+0

@dwelch啊謝謝你的提示,對我的理解有了很大的幫助。我也會記住不要給他們一個數組 – allejo

回答

2
  1. 你只是覆蓋元素。在這個層次上有「數組之類的東西」,但只有固定大小的預分配數組。 .skip正在分配固定大小的數組。*可變大小的可擴展數組通常會使用堆棧或堆實現更復雜的動態內存分配代碼。
  2. 如果您有像loop:這樣的標籤(實際名稱是任意的),則可以使用b loop將其分支(返回)。 (也許,你會希望有條件做分公司,使程序沒有永遠循環下去。)您可以通過改變R0,訪問循環不同的元素,你已經在做

另外,b main ISN」因爲它正在分支給他的下一個指令,所以它確實服務於任何目的。如果您將其刪除,代碼將執行相同的操作。

[*]或者,你可以說,你的陣列是和R0(不包括內存R0點)之間剛剛元素,其中,通過改變R0要擴展的陣列。但最大尺寸仍由.skip指令修復。

+0

謝謝你的解釋,沒有意識到'loop:'是任意的。快速問題,我將如何去訪問不同的元素? – allejo

+1

也許你想在'MyArray'指向'R0'(例如'ldr R0,= MyArray'或'adr R0,MyArray'),然後做'str rx,[R0,#4]'或者'str rx,[R0 ,R2]'其中'R2'的值爲0,4,8,... – scott