ARM汇编指令的书写格式

      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,可以用来表示"如果相等,则传送数据"

ARM汇编指令中的条件码
条件码[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

ARM条件码的使用
C语言描述 ARM汇编语言描述
if(a>b)
     a++;
else
     b++;
CMP  R0,R1
ADDHI  R0,R0,#1
ADDLS  R1,R1,#1


你可能感兴趣的:(STM32学习)