AAPCS
Def: Procedure Call Standard for the ARM Architecture
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
.code
Def: 指定生成的指令集格式 32 或 16 位元
Ex: .code 32 or .code 16
.section
Def: 宣告某代碼區段為該section的
.global
Def: 宣告為全域變數
.align
Def: 將code對齊邊界 ,單位是2的平方
ex: .align 2 /*= 2*2 */
.equ
Def: 就如同C語言的 #define 一樣
ex: .equ var1 , 0x50000000
.word
Def: 在記憶體中配置4bytes的空間,並且可以初始化數值
ex: _label: .word __vector_reset
str
Def: register--->memory
將src暫存器的內容直搬到搬到一記憶體位址
ex: str r1, [r0] /*r1的內容值放入r0的位址*/
str r1, [ r0 ,#4 ] /*r1的內容值放入r0+4的位址*/
str r1, [r0] , #4 /*r1的內容值放入r0的位址,並且 --> r0=r0+4*/
ldr
Def: memory--->register
將記憶體的內容值LOAD進通用暫存器R0~R12
ex: ldr r0 , =_start /* 將標籤所在位址放入r0 */
ldr r0 , = 0x123 /* 立即值放入r0 */
ldr r0 , [r1,#4] /* 將 (r1+4)地址中的內容值放入r0 */
ldr r0, [r1],#4 /* 將 (r1+0)地址中的內容值放入r0,並且 --> r1=r1+4 */
adr
Def: 將記憶體位址LOAD進通用暫存器R0~R12
ex: adr r0 , =_address
cmp
Def: 將2數相減看是否為零,以此來進行比較,並且將比較結果更新至CPSR
的零旗標
ex: cmp r1,r3
bne
Def: 常與cmp搭配使用,cmp的結果不相等才跳躍
ex:
cmp r1,r3 /*更新至CPSR*/
bne _main /*看CPSR的值決定*/
beq
Def: 常與cmp搭配使用,cmp的結果相等才跳躍
ex:
cmp r1,r3 /*更新至CPSR*/
beq _main /*看CPSR的值決定*/
sub{s}
Def: 在尾端加s表示運算的結果會更新到CPSR
ex: subs r3,r3,#1 --> 當r3-1 =0 ,CPSR的的零旗標會變成1
teq
Def: 將2運算元的內容值執行XOR運算,並且結果會更新至CPSR旗標位元
ex: teq r1, #0x1a or teq r1,r2
orr
Def: 將2運算元進行OR運算(orr Rd ,op1 ,op2) ,並存入目的暫存器Rd,
其中運算元1(op1)必須是暫存器
ex:
orr r1 ,r2,#3
orr r1 ,r1,r2
b{gt}
Def: 若為正數值(代表>0)就進行跳轉
stm & ldm
Def:
stm (Store Multiple registers):儲存多個暫存器的值到mem
ldm (Load Multiple registers):從mem載入到多個暫存器
ex:
STMFD(多個暫存器push到堆疊)
stmfd r13!,{r0-r3}
LDMFD(多個暫存器pop到堆疊)
ldmfd r13!,{r0-r3}
FD(Full Descending stack):堆疊為下(低位址)增長,SP(R13)指向DATA本身
!:指令執行完後,將地址寫回r13
C語言的內嵌
asm(
" instruction 1 ...
instruction 2 ...
:
"
: 輸出列表
: 輸入列表
: 被更改的resource
);
ex:
void function(void){
unsigned int var1= 123;
unsigned int var2= 456;
asm (
" ldr r0 , = %0 ;" /* %0 代表輸入參數第一項,即var1 */
"ldr r1 , = %1 ;" /* %1 代表輸入參數第二項,即var2 */
:
"\n"
: 無
: "=r" (var1) , "=r" (var2) /*輸入為var變數 ,
" r"代表暫存器r0~r15,
"="代表唯寫*/
: "r0" ,"r1" /*表示r0和r1 會被更改到*/
);
}
沒有留言:
張貼留言