2015年9月14日 星期一

ARM組語備忘錄

 

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 會被更改到*/

                );
            }
   

沒有留言:

張貼留言