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