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

ARM 723瀏覽

  • 在程序中,我們可以使用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

七星彩走势图2元网官网