Arm彙編學習筆記(八)——寄存器的使用


  • 在程序中,我們可以使用16個通用寄存器中的14個來保存自己的數據,r13和r15分別是sp和pc寄存器,我們無法使用。

  • ATPCS規定,棧指針應該是8字節對齊。

  • ATPCS規定,被調用函數必須保證在執行前和執行後r4-r11的內容不變,即被調用函數必須在開始保存r4-r11,返回前再恢復。如下圖:


可以用下面的保存模版:

routine_name
                    STMFD sp!, {r4-r12, lr} ; stack saved registers
                    ; body of routine
                    ; the fourteen registers r0-r12 and lr are available
                    LDMFD sp!, {r4-r12, pc} ; restore registers and return
其中保存r12是爲了棧指針8字節對齊。

  • ATPCS規定,函數調用過程中,r0-r3用於傳遞參數,超過4個的參數保存在棧中。返回值必須保存在r0中。

  • 多寄存器入棧出棧指令,例如LDM和STM,寄存器列表中的寄存器號必須是升序。

  • 雙字的加載和存儲指令,LDRD和STRD,操作數寄存器是相鄰的兩個寄存器,Rd和Rd+1,並且這個Rd的寄存器號必須是偶數。
  • Use register names rather than physical register numbers when writing assembly routines. This makes it easier to reallocate registers and to maintain the code. (不太明白什麼意思,是不是用RN定義別名?)
  • 爲了節省寄存器,我們可以將一些位數比較少的變量存儲在一個寄存器中,然後通過位移操作就可以取出相應變量。看下面例子:
sample = table[index];
index += increment;
一般情況下,index和increment不會超過16位,我們就可以將它們兩個存放到同一個寄存器中,如下圖

上面C代碼我們可以用下面彙編代碼實現:

LDRB sample, [table, indinc, LSR#16] ; table[index]
ADD indinc, indinc, indinc, LSL#16 ; index+=increment




發佈了59 篇原創文章 · 獲贊 42 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章