關於部落格
職場生活筆記....熱情依然在
  • 50699

    累積人氣

  • 1

    今日人氣

    1

    追蹤人氣

ARM GNU GCC Inline Assembler Part II

ASM 語法 可分兩類 1. 基本語法(Basic Inline) 2. 延伸語法(Extended ASM) .
基本語法我們就不討論了,因為就像一般我們寫arm指令一樣只是多加個 __asm__(); 
在這裡就先討論Extended ASM 他的語法如下:

asm ( assembler template
           : output operands                  /* optional */
           : input operands                   /* optional */
           : list of clobbered registers      /* optional */
           );

1.  assembler template:  
這一欄需要填入你要寫的ASM碼,指令需要用 "  " 包起來,如果要寫多行指令在此則 需要用分號來分隔各個指令,指令內部需要用到組語外部參數則用%0,%1,.......(需要用到的參數 必須先指定)

2.  output operands
這一欄則填入需要用到的輸出參數,用( )包起來並可以限定用途,如下面這個範例用"=r"來限定輸出result用register運算並在做完後才回存%0 是指 result  %1指的是 value ,0~%n的指定則是由第一個輸出operand到最後一個輸入operand.
ex: asm("mov %0, %1, ror #1" : "=r" (result) : "r" (value));

3.  input operands 
這一欄則填入需要用到的輸入參數,用( )包起來並可以限定用途,下面這個範例用"r"來限定輸入value 先搬到register 再用register做運算
ex: asm("mov %0, %1, ror #1" : "=r" (result) : "r" (value));

4. list of clobbered registers      
如果你的運算必須指定特定的暫存器來做運算,則必須把暫存器名稱列在這個地方,這樣一來
gcc則會reserve這些暫存器給這段assemblly code使用!
  
  4.1 如果這段指定"memory"的話,在執行這段assembler code前,gcc會把暫存在register的contents先flush到contents, 才執行這段assembler code 在執行後也會把reload 回去!
  4.2 如果指定數字,則是通知gcc 這個operand和第n個operand使用同一個暫存器
         ex: asm volatile("mov %0, %0, ror #1" : "=r" (value) : "0" (value)); input operand 和 output operand 共用同一個暫存器!

表格(限制operand的字符) 參考自
http://www.ethernut.de/en/documents/arm-inline-asm.html
ConstraintUsed forRange
fFloating point registers 
IImmediate operands8 bits, possibly shifted.
JIndexing constants-4095 .. 4095
KNegated value in rhs-4095 .. 4095
LNegative value in rhs-4095 .. 4095
MFor shifts.0..32 or power of 2
rGeneral registers 

Modifier Specifies
= Write-only operand, usually used for all output operands.
+ Read-write operand (not supported by inline assembler)
& Register should be used for output only


相簿設定
標籤設定
相簿狀態