汇编语言基础知识(cortex-M3 指令)

一、书写格式

标号

  操作码  操作数1,  操作数2, ...  ;  注释


标号是可选的,可写可不写,但如果有必须顶格写,其作用是让汇编器计算程序转移的地址。

操作码是指令的助记符,其前面必须有一个空格,通常用TAB。

操作数跟在操作码后面,通常,第一个操作数都是本条指令执行结果的存储地。

注释均已";"开头

立即数,也就是高级语言的常量,必须以#开头。

例如:

  MOV  R0,  #0x12  ;  R0 <--  0x12

可以使用EQU来定义常数,且常数的定义必须顶格写。

例如:

PI  EQU  3.14.5926


二、

操作 汇编指令
寄存器值与寄存器值及 C标志相加 ADC ,
3位立即数与寄存器值相加 ADD , , #
8位立即数与寄存器值相加 ADD , #
低寄存器值与低寄存器值相加 ADD , ,
高寄存器值与低或高寄存器值相加 ADD ,
PC48位立即数) ADD , PC, #*4
SP48位立即数) ADD , SP, #*4
SP47位立即数) ADD , SP, #*4ADD SP, SP,
#*4
寄存器值按位与 AND ,
算术右移,移位次数取决于立即数值 ASR , , #
算术右移,移位次数取决于寄存器中的值 ASR ,
条件分支 B
无条件分支 B
位清零 BIC ,
软件断点 BKPT
带链接分支 BL
比较结果不为零时分支 CBNZ ,
比较结果为零时分支 CBZ ,
将寄存器值取反与另一个寄存器值比较 CMN ,
8位立即数比较 CMP , #
寄存器比较 CMP ,
高寄存器与高或低寄存器比较 CMP ,
改变处理器状态 CPS ,
将高或低寄存器的值复制到另一个高或低寄
存器中
CPY ,
寄存器的值按位异或 EOR ,
IT IT IT
IT
以下一条指令为条件,以下面两条指令为条
件,以下面三条指令为条件,以下面四条指令
为条件
多个连续的存储器字加载 LDMIA !,
将基址寄存器与 5位立即数偏移的和的地址
处的数据加载到寄存器中
LDR , [, #]
将基址寄存器与寄存器偏移的和的地址处的
数据加载到寄存器中
LDR , [, ]
PC8位立即数偏移的和的地址处的数据
加载到寄存器中
LDR , [PC, #*4]
SP8位立即数偏移的和的地址处的数据
加载到寄存器中
LDR , [SP, #*4]
将寄存器与 5位立即数偏移的和的地址处的
字节[7:0]加载到寄存器中
LDRB , [, #]
将寄存器与寄存器偏移的和的地址处的字节
[7:0]加载到寄存器中
LDRB , [, ]
将寄存器与 5位立即数偏移的和的地址处的
半字[15:0]加载到寄存器中
LDRH , [, #*2]
将寄存器与寄存器偏移的和的地址处的半字
[15:0]加载到寄存器中
LDRH , [, ]
将寄存器与寄存器偏移的和的地址处的带符
号字节 [7:0]加载到寄存器中
LDRSB , [, ]
将寄存器与寄存器偏移的和的地址处的带符
号半字 [15:0]加载到寄存器中
LDRSH , [, ]
逻辑左移,移位次数取决于立即数值 LSL , , #
逻辑左移,移位次数取决于寄存器中的值 LSL ,
逻辑右移,移位次数取决于立即数值 LSR , , #
逻辑右移,移位次数取决于寄存器中的值 LSR ,
8位立即数传送到目标寄存器 MOV , #
将低寄存器值传送给低目标寄存器 MOV ,
将高或低寄存器值传送给高或低目标寄存器 MOV ,
寄存器值相乘 MUL ,
将寄存器值取反后传送给目标寄存器 MVN ,
将寄存器值取负并保存在目标寄存器中 NEG ,
无操作 NOP
将寄存器值按位作逻辑或操作 ORR ,
寄存器出栈 POP <寄存器>
寄存器和 PC出栈 POP <寄存器, PC>
寄存器压栈 PUSH
寄存器和 LR压栈 PUSH
将字内的字节逆向(reverse)并复制到寄存器
REV ,
将两个半字内的字节逆向并复制到寄存器中 REV16 ,
将低半字[15:0]内的字节逆向并将符号位扩
展,复制到寄存器中。
REVSH ,
循环右移,移位次数由寄存器中的值标识 ROR ,
寄存器中的值减去寄存器值和C标志 SBC ,
发送事件 SEV
将多个寄存器字保存到连续的存储单元中 STMIA !,
将寄存器字保存到寄存器与5位立即数偏移的
和的地址中
STR , [, #*4]
将寄存器字保存到寄存器地址中 STR , [, ]
将寄存器字保存到SP8位立即数偏移的和的
地址中
STR , [SP, # * 4]
将寄存器字节[7:0]保存到寄存器与 5位立即
数偏移的和的地址中
STRB , [, #]
将寄存器字节[7:0]保存到寄存器地址中 STRB , [, ]
将寄存器半字[15:0]保存到寄存器与 5位立即
数偏移的和的地址中
STRH , [, # * 2]
将寄存器半字[15:0]保存到寄存器地址中 STRH , [, # * 2]
寄存器值减去3位立即数 STRH , [, # * 2]
寄存器值减去8位立即数 SUB , #
寄存器值减去寄存器值 SUB , ,
SP47位立即数) SUB SP, # * 4
操作系统服务调用,带8位立即数调用代码 SVC
从寄存器中提取字节[7:0],传送到寄存器中,
并用符号位扩展到32
SXTB ,
从寄存器中提取半字[15:0],传送到寄存器中,
并用符号位扩展到32
SXTH ,
将寄存器与另一个寄存器相与,测试寄存器中
的置位的位
TST ,
从寄存器中提取字节[7:0],传送到寄存器中,
并用零位扩展到 32
UXTB ,
从寄存器中提取半字[15:0],传送到寄存器中,
并用零位扩展到32
UXTH ,
等待事件 WFE
等待中断 WFI


                                                        

 

  32位指令

操作 汇编指令
ADC{S}.W , ,
#
寄存器值与12位立即数及C位相加
寄存器值与移位后的寄存器值及C位相加 ADC{S}.W , , {, }
ADD{S}.W ,
,#
寄存器值与12位立即数相加
寄存器值与移位后的寄存器值相加 ADD{S}.W , {, }
寄存器值与12位立即数相加 ADDW.W , , #
AND{S}.W , ,
#
寄存器值与12位立即数按位与
寄存器值与移位后的寄存器值按位与 AND{S}.W , , Rm>{, }
算术右移,移位次数取决于寄存器值 ASR{S}.W , ,
条件分支 B{cond}.W
位区清零 BFC.W , #, #
将一个寄存器的位区插入另一个寄存器中 BFI.W , , #, #
12位立即数取反与寄存器值按位与 BIC{S}.W , ,
#
移位后的寄存器值取反与寄存器值按位与 BIC{S}.W , , {, }
带链接的分支 BL
带链接的分支(立即数) BL
无条件分支 B.W
返回寄存器值中零的数目 CLZ.W ,
寄存器值与12位立即数两次取反后的值比较 CMN.W , #
寄存器值与移位后的寄存器值两次取反后的
值比较
CMN.W , {, }
寄存器值与12位立即数比较 CMP.W , #
寄存器值与移位后的寄存器值比较 CMP.W , {, }
数据存储器排序(barrier DMB
数据同步排序(barrier DSB
寄存器值与12位立即数作异或操作 EOR{S}.W , ,
#
寄存器值与移位后的寄存器值作异或操作 EOR{S}.W , , {, }
指令同步排序(barrier ISB
多存储器寄存器加载,加载后加 1或加载前
1
LDM{IA|DB}.W {!},
保存寄存器地址与12位立即数偏移的和的地
址处的数据字
LDR.W , [, #]
将寄存器地址与12位立即数偏移的和的地址
处的数据字保存到PC
LDR.W PC, [, #]
将基址寄存器地址的8位立即数偏移的地址
处的数据字保存到PC中,后索引
LDR.W PC, #<+/-
保存基址寄存器地址的8位立即数偏移的地
址处的数据字,后索引
LDR.W , [], #+/–
保存基址寄存器地址的8位立即数偏移的地
址处的数据字,前索引
LDR.W , [, #<+/–]!
将基址寄存器地址的8位立即数偏移的地址
处的数据字保存到PC中,前索引
LDR.W PC, [, #+/–]!
保存寄存器地址左移0123个位置后的
地址处的数据字
LDR.W , [, {, LSL #}]
将寄存器地址左移0123个位置后的地
址处的数据字保存到PC
LDR.W PC, [, {, LSL #}]
保存PC地址的12位立即数偏移的地址处的数
据字
LDR.W , [PC, #+/–]
PC地址的12位立即数偏移的地址处的数据
字保存到PC
LDR.W PC, [PC, #+/–]
保存基址寄存器地址与12位立即数偏移的和
的地址处的字节[7:0]
LDRB.W , [, #]
保存基址寄存器地址的8位立即数偏移的地
址处的字节[7:0],后索引
LDRB.W . [], #+/-
保存寄存器地址左移0123个位置后的
地址处的字节[7:0]
LDRB.W , [, {, LSL #}]
保存基址寄存器地址的8位立即数偏移的地
址处的字节[7:0],前索引
LDRB.W , [, #<+/–]!
保存PC地址的12位立即数偏移的地址处的字
LDRB.W , [PC, #+/–]
保存寄存器地址8位偏移4的地址处的双字,
前索引
LDRD.W , , [, #+/–
* 4]{!}
保存寄存器地址8位偏移4的地址处的双字,
后索引
LDRD.W , , [],
#+/– * 4
保存基址寄存器地址与12位立即数偏移的和
的地址处的半字[15:0]
LDRH.W , [, #]
保存基址寄存器地址的8位立即数偏移的地
址处的半字[15:0],前索引
LDRH.W , [, #<+/–]!
保存基址寄存器地址的8位立即数偏移的地
址处的半字[15:0],后索引
LDRH.W . [], #+/-
保存基址寄存器地址左移0123个位置
后的地址处的半字[15:0]
LDRH.W , [, {, LSL #}]
保存PC地址的12位立即数偏移的地址处的半
LDRH.W , [PC, #+/–]
保存基址寄存器地址与12位立即数偏移的和
的地址处的带符号字节[7:0]
LDRSB.W , [, #]
保存基址寄存器地址的8位立即数偏移的地
址处的带符号字节[7:0],后索引
LDRSB.W . [], #+/-
保存基址寄存器地址的8位立即数偏移的地
址处的带符号字节[7:0],前索引
LDRSB.W , [, #<+/–]!
保存寄存器地址左移0123个位置后的
地址处的带符号字节[7:0]
LDRSB.W , [, {, LSL #}]
保存PC地址的12位立即数偏移的地址处的带
符号字节
LDRSB.W , [PC, #+/–]
保存基址寄存器地址与12位立即数偏移的和
的地址处的带符号半字[15:0]
LDRSH.W , [, #]
保存基址寄存器地址的8位立即数偏移的地
址处的带符号半字[15:0],后索引
LDRSH.W . [], #+/-
保存基址寄存器地址的8位立即数偏移的地
址处的带符号半字[15:0],前索引
LDRSH.W , [, #<+/–]!
保存寄存器地址左移0123个位置后的
地址处的带符号半字[15:0]
LDRSH.W , [, {, LSL #}]
保存PC地址的12位立即数偏移的地址处的带
符号半字
LDRSH.W , [PC, #+/–]
逻辑左移,移位次数由寄存器中的值标识 LSL{S}.W , ,
逻辑右移,移位次数由寄存器中的值标识 LSR{S}.W , ,
将两个带符号或无符号的寄存器值相乘,并
将低32位与寄存器值相加
MLA.W , , ,
将两个带符号或无符号的寄存器值相乘,并
将低32位与寄存器值相减
MLS.W , , ,
12位立即数传送到寄存器中 MOV{S}.W ,
#
将移位后的寄存器值传送到寄存器中 MOV{S}.W , {, }
16位立即数传送到寄存器的高半字[31:16]
MOVT.W , #
16位立即数传送到寄存器的低半字[15:0]
中,并将高半字[31:16]清零
MOVW.W , #
将状态传送到寄存器中 MRS ,
传送到状态寄存器中 MSR _,
将两个带符号或不带符号的寄存器值相乘 MUL.W , ,
无操作 NOP.W
将寄存器值与12位立即数作逻辑或非操作 ORN{S}.W , ,
#
将寄存器值与移位后的寄存器值作逻辑
操作
ORN[S}.W , , {, }
将寄存器值与12位立即数作逻辑操作

ORR{S}.W , ,

#

将寄存器值与移位后的寄存器值作逻辑
操作
ORR{S}.W , , {, }
将位顺序逆向 RBIT.W ,
将字内的字节逆向 REV.W ,
将每个半字内的字节逆向 REV16.W ,
将低半字内的字节逆向并用符号扩展 REVSH.W ,
循环右移,移位次数取决于寄存器中的值 ROR{S}.W , ,
寄存器值与12位立即数相减 RSB{S}.W , ,
#
寄存器值与移位后的寄存器值相减 RSB{S}.W , , {, }
寄存器值与12位立即数及C位相减 SBC{S}.W , ,
#
寄存器值与移位后的寄存器值及C位相减 SBC{S}.W , , {, }
将所选的位复制到寄存器中并用符号扩展 SBFX.W , , #, #
带符号除法 SDIV ,,
发送事件 SEV
将带符号半字相乘并用符号扩展到2个寄存
器值
SMLAL.W , , ,
两个带符号寄存器值相乘 SMULL.W , , ,
带符号饱和操作 SSAT , #, {, }
多个寄存器字保存到连续的存储单元中 STM{IA|DB}.W {!},
寄存器字保存到寄存器地址与12位立即数偏
移的和的地址中
STR.W , [, #]
寄存器字保存到寄存器地址的8位立即数偏
移的地址中,后索引
STR.W , [], #+/–
寄存器字保存到寄存器地址移位0123
个位置的地址中
STR.W , [, {, LSL #}]
寄存器字保存到寄存器地址的8位立即数偏
移的地址中,前索引
STR{T}.W , [, #+/–]{!}
寄存器字节[7:0]保存到寄存器地址的 8位立
即数偏移的地址中,前索引
STRB{T}.W , [, #+/–]{!}
寄存器字节[7:0]保存到寄存器地址与 12
立即数偏移的和的地址中
STRB.W , [, #]
寄存器字节[7:0]保存到寄存器地址的 8位立
即数偏移的地址中,后索引
STRB.W , [], #+/–
寄存器字节保存到寄存器地址移位012
3个位置的地址中
STRB.W , [, {, LSL #}]
存储双字,前索引 STRD.W , , [, #+/–
* 4]{!}
存储双字,后索引 STRD.W , , [],
#+/– * 4
寄存器半字[15:0]保存到寄存器地址与 12
立即数偏移的和的地址中
STRH.W , [, #]
寄存器半字保存到寄存器地址移位012
3个位置的地址中
STRH.W , [, {, LSL #}]
寄存器半字保存到寄存器地址的8位立即数
偏移的地址中,前索引
STRH{T}.W , [, #+/–]{!}
寄存器半字保存到寄存器地址的8位立即数
偏移的地址中,后索引
STRH.W , [], #+/–
寄存器值与12位立即数相减 SUB{S}.W , ,
#
寄存器值与移位后的寄存器值相减 SUB{S}.W , , {, }
寄存器值与12位立即数相减 SUBW.W , , #
将字节符号扩展到32 SXTB.W , {, }
将半字符号扩展到32 SXTH.W , {, }
表格分支字节 TBB [, ]
表格分支半字 TBH [, , LSL #1]
寄存器值与12位立即数作逻辑异或操作 TEQ.W , #
寄存器值与移位后的寄存器值作逻辑异或
操作
TEQ.W , {,
寄存器值与12位立即数作逻辑操作 TST.W , #
寄存器值与移位后的寄存器值作逻辑
TST.W , {, }
将寄存器的位区复制到寄存器中,并用零扩
展到32
UBFX.W , , #, #
无符号除法 UDIV ,,
两个无符号寄存器值相乘并与两个寄存器值
相加
UMLAL.W , , ,
两个无符号寄存器值相乘 UMULL.W , , ,
无符号饱和操作 USAT , #, {, }
将无符号字节复制到寄存器中并用零扩展到
32
UXTB.W , {, }
将无符号半字复制到寄存器中并用零扩展到
32
UXTH.W , {, }
等待事件 WFE.W
等待中断 WFI.W


 








 


你可能感兴趣的:(STM32)