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 |