STM32系列處理器中的編譯器可以支持Thumb-2指令以實現處理器在ARM模式和Thumb模式之間的自由轉換。因此STM32系列處理器中的編譯器引入了"統一彙編語言"(UAL)語法機制。
在UAL機制下,用戶可以使用統一的32位Thumb-2指令的語法格式書協這些指令,並且有編譯器來決定是使用16位的Thumb指令,還是使用32位的ARM指令。
ADD R0, R1 ;使用Thumb指令集,實現寄存器R0與R1中的數值累加
ADD R0, R0, R1 ;使用UAL語法實現同樣的功能,R0=R0+R1
在傳統Thumb指令集中,部分指令默認在完成相應的指令操作後,無論指令是否有S後綴,都會自動更新寄存器APSR中的內容。相比UAL語法格式,用戶必須指定S後綴才能更新APSR中的內容。
AND R0,R1 ;使用Thumb語法實現寄存器R0,R1中數值的與操作
ANDS R0,R0,R1 ;UAL語法實現R0 = R0&R1
需要用戶注意的是,絕大部分16位Thumb指令只能訪問R0~R7寄存器;而32位的Thumb指令可以自由訪問R0~R15寄存器。
ADDS R0,#1 ;爲節省代碼空間,編譯器自動選擇使用16位Thumb指令
ADDS.N R0,#1 ;用戶通過.N(Narrow)後綴指定編譯器使用16位Thumb指令
ADDS.W R0,#1 ;用戶通過.W(Wide)後綴指定編譯器使用32位ARM指令
在ARM彙編語言中,數據傳送指令MOV後面加上條件後綴EQ,即MOVEQ,可以用來表示"如果相等,則傳送數據"
條件碼[31:28] | 助記符 | 判決條件 | CPSR的標誌位 |
0000 | EQ | Z=1 | 相等或等於0 |
0001 | NE | Z=0 | 不相等 |
0010 | CS | C=1 | 大於或等於(無符號比較) |
0011 | CC | C=0 | 小於(無符號比較) |
0100 | MI | N=1 | 負數 |
0101 | PL | N=0 | 正數或0 |
0110 | VS | V=1 | 溢出 |
0111 | VC | V=0 | 未溢出 |
1000 | HI | C=1 & Z=0 | 大於無符號比較 |
1001 | LS | C=0 & Z=1 | 小於或等於(無符號比較) |
1010 | GE | N=V | 大於或等於(有符號比較) |
1011 | LT | N!=V | 小於(有符號比較) |
1100 | GT | Z=0 & N=V | 大於(有符號比較) |
1101 | LE | Z=1 & N!=V | 小於或等於(有符號比較) |
1110 | AL | 保留,未使用 | 任意值 |
1111 | 保留,未使用 | 保留,未使用 | 保留,未使用 |
比較兩個數的大小,並將較大的數加1
C語言描述 | ARM彙編語言描述 |
if(a>b) a++; else b++; |
CMP R0,R1 ADDHI R0,R0,#1 ADDLS R1,R1,#1 |