资讯详情

arm汇编指令

汇编: 指令 伪指令 符号 arm指令分类: 跳转指令 数据处理指令 数据传送指令 乘法指令 Load/Store(加载存储)指令 程序状态寄存器访问指令 通用寄存器和存储器内容交换指令 异常产生指令 协处理指令(暂时不讲) 信号量指令(暂时不讲) 其他扩展指令(暂时不讲) 指令寻址方式: 数据处理指令操作数寻址方式 内存访问指令寻址方式 几乎所有arm指令都能条件执行: 31 30 29 28 四位表示条件位,共16个条件。 Cpsr中的条件标志位N V的值来确定指令是否执行。 cond的16种条件: shifter_operand(第二源操作数)的三种形式: # 立即数 指令里面的立即数前面加#。 嵌入式一般用十六进制,前面加0x。 寄存器 寄存器移位9种: 逻辑左移:将Rm寄存器逻辑左移shift_imm(立即数)位或Rs(寄存器)位。 ,L #/ 逻辑右移: ,LSR #/ 算术右移: ,ASR #/ 循环右移 ,ROR #/ 扩展循环右移: ,RRX :Rm扩展的循环右移一位。 S标志位: 决定是否更新cpsr中的标志位; 如果S=1,更新cpsr标志位,当Rd不为R15,cpsr中的NZCV根据指令的执行结果设置,其他位不动;当Rd是R15,当前程序状态的spsr拷贝到cpsr。 如果S=0,不更新cpsr。 {}表示可选项. ----------------------------------------- 跳转指令: B :跳转,用于死循环 BL :带返回的跳转,函数调用 BX :跳转并切换状态 BLX:带返回的跳转并切换状态 三种跳转形式: 1.跳转到标号处LABLE 2.跳转到绝对地址0xXXX 3.跳转到子程序func处 ----------- 跳转(B)和带返回的跳转(BL) B{L}{} 编码格式: 条件代码标识 控制位 31-28 24 23-0 NZCV 101 L 跳转的地址 L:L位,也就是寄存器的24位,bit【24】=1,指令存储返回地址到LR,bit【24】=0,不保存返回地址。 cond:指令执行的条件 target_address:指令跳转的目标地址;计算目标地址方法: 将24位带符号的补码立即数扩展为32位; 将扩展后的32位立即数左移两位; 将得到的值加到PC寄存器中即可。 ---------- 跳转并切换状态 BX{} Rm的第0位拷贝到cpsr的T位,其他位移入PC。 编码格式: 条件代码标识 31-28 19-16 15-12 3-0 NZCV 00010010 SB0 SB0 0001 Rm cond:指令执行条件 :包含跳转指令的目标地址;Rm的bit【0】=0,目标地址处指令为ARM指令;如果bit【1】=1,目标地址处指令为Thumb指令。 ---------- 带状态切换的连接跳转指令 BLX 编码格式: 条件代码标识 31-28 24 23-0 1111 101 H Rm target_add:指令的跳转目标地址;计算方法: 将24位扩展为32位立即数; 将结果左移两位; 将H(bit【24】)加到结果地址的第一位bit【1】; 将结果累加进程序 pc中。 BLX{comd} Rm的第0位拷贝到cpsr的T位,其他位移入PC。 编码格式: 条件代码标识 31-28 19-16 11-8 3-0 NZCV 00010010 SB0 SB0 0011 Rm cond:指令执行条件 Rm:寄存器Rm指定转移目标,Rm的bit【0】=1,跳转时自动将cpsr的标志位T置位,就是解释为Thumb,否则解释为ARM。 ------------------------------------------- 数据处理指令: 算数运算指令 ADD:加 A :带进位的加 SUB:减 RSB:翻转减 SBC:带进位的减 RSC:带进位的翻转减 测试与测试指令 T :测试 Q:测试相等 CMP:比较 CMN:负数比较 逻辑指令 BIC:位清0 AND:逻辑加 ORR:逻辑或 EOR:逻辑异或 编码格式: 条件代码标识 31-28 25 24-21 20 19-16 15-12 11-0 NZCV 00 I opcode S Rn Rd shiter_operand I:区分第二操作偶数是立即数还是寄存器 S:标志指令的条件域是否更新cpsr Opcode:操作符 Rd:指示目的寄存器 Rn:指示第一源操作寄存器 Shifter_operand:指示第二源操作数,可以是立即数,寄存器,寄存器移位三种形式: 数据处理指令的语法格式分两种: 算术运算和逻辑运算的格式: {}{S} ,, 比较和测试的格式(没有Rd; S=1) {} , ----- 算数运算指令 ADD{}{S} ,, 将shifter_operand加Rn,结果存到Rd中。 ADC{}{S} ,, 带进位的加法,处理大于32位的加法 将shifter_operand加Rn,再加cpsr中的C标志位,结果存到Rd。 SUB{}{S} ,, 将Rn减shifter_operand,结果保存到Rd中。 SBC{}{S} ,, 带进位的减法,处理大于32位的减法 Rn减去shifter_operand,再减去cpsr中的C标志位的反码,结果保存到Rd。 RSB{}{S} ,, 翻转减,处理负数 shifter_operand减去Rn,结果保存到Rd。 RSC{}{S} ,, 带进位的翻转减,处理大于32位的负数 shifter_operand减去Rn,再减去cpsr中的C标志位的反码,结果保存到Rd。 ----- 逻辑运算指令 AND{}{S} ,, 逻辑与 Rn与shifter_operand按位逻辑与,结果保存到Rd中。 与1与会保持不变,与0与变为复位(变0)。 EOR{}{S} ,, 逻辑异或,不同则为1,相同则为0 Rn和shifter_operand进行按位逻辑异或,结果保存到Rd中。 与0异或保持不变,与1异或会反转。 ORR{}{S} ,, 逻辑或 Rn与shifter-_operand进行按位逻辑或,结果保存到Rd中。 与0或会保持不变 ,与1或可以置位(変1)。 BIC{}{S} ,, Rn的源码与shifter_operand的反码按位进行逻辑与,结果保存到Rd中。 ----- 比较测试 CMP{} , 比较指令 用Rn减去shifter_operand,自动更新cpsr的标志位。 CMN{} , 负数比较指令 用Rn的原值减去shifter_operand的负数指(相当与两者相加),自动更新cpsr的标志位。 TST{} , 测试指令 将Rn和shifter_oerand进行按位逻辑与,自动更新cpsr的标志位。 TEQ{} , 测试相等指令 将Rn和shifter_operand进行按位逻辑异或,自动更新cpsr的标志位。 --------------------------------------------- 数据传送指令: MOV{cond}{S} , 编码格式: 条件代码标识 31-28 20 15-12 11-0 NZCV 00 1 1101 S 0000 Rd shiter_operand cond:条件,指令只有在条件满足时才执行。 S:S标识,S(bit【20】)=1,更新cpsr。如果Rd=r15,CPSR= SR,如果Rd不是r15,根据传送的数值设置cpsr的NZCV。如果S=0,不更新cpsr。 Rd:确定目标寄存器 shifter_operand:确定操作数,可以是立即数,寄存器,寄存器移位的形式。 MVN{}{S} , 传送反码,将shifter_operand按位取反传送给Rd。 编码格式: 条件代码标识 31-28 20 15-12 11-0 NZCV 00 1 1111 S 0000 Rd shiter_operand ------------------------------------------- 乘法指令 编码格式: 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 mul S Rd/RdHi Rn/RdLo Rs 1001 Rm mul: RdHi:RdLo 由RdHi(最高有效32位)和RdLo(最低有效32位)链接形成的64位数 [31:0] 表示只选取结果的最低有效32位。 := 表示简单的赋值。 S:S位,控制cpsr条件控制位的设置,具体设置如下: 产生32位结果,N=Rd【31】;64位结果的,N=RdHi【31】。 产生32位结果,Rd=0时,Z=1;64位结果的,RdHi和RdLo都为0,Z=1. C设置成无意义的指,V不变。 MUL{}{S} ,, 乘法指令 31-28 23-21 20 19-16 11-8 3-0 NZCV 0000 000 S Rd Rs 1001 Rm Rm*Rs,取结果的最低32位保存到Rd中。 MLA{}{S} ,,, 乘-累加指令 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 001 S Rd Rn Rs 1001 Rm Rm*Rs,乘积加Rn,取结果的低32位保存到Rd。 UMULL{}{S} ,,, 无符号长乘指令 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 100 S RdHi RdLo Rs 1001 Rm Rm和Rs进行无符号相乘,结果低32位保存到RdLo,高32位保存到RdHi。 UMLAL{}{S} ,,, 无符号长乘-累加指令 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 101 S RdHi RdLo Rs 1001 Rm Rm和Rs做无符号相乘,64位乘积与RdHi:RdLo相加,结果低32位保存到RdLo中,高32位保存到RdHi中。 SMULL{}{S} ,,, 有符号数长乘指令 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 110 S RdHi RdLo Rs 1001 Rm Rm和Rs做有符号相乘,结果低32位保存到RdLo中,高32位保存到RdHi中。 SMLAL{}{S} ,,, 有符号数长乘-累加指令 31-28 23-21 20 19-16 15-12 11-8 3-0 NZCV 0000 111 S RdHi RdLo Rs 1001 Rm Rm和Rs做有符号相乘,64位乘积和RdHi:RdLo相加,结果低32位保存到RdLo中,高32位保存到RdHi中。 ------------------------------------------- ARM加载存储指令 单寄存器加载/存储指令:单数据传送,字节,半字和字都可以。 多寄存器加载/存储指令:传大数据,进程进入、退出、保存、恢复,内存数据拷贝。 单寄存器交换指令:寄存器和存储器进行数据交换,用于多处理器实现信号量。 ----- 单寄存器指令: 字: LDR:Load 加载:从内存到寄存器 STR:Store 储存:从寄存器到内存 B:字节 H:半字 S:有符号 T:用户模式 31-28 25 24 23 22 21 20 19-16 15-12 11-0 NZCV 0 X L P U I W S Rn Rd addr_mode L:L=1,进行加载,否则是存储 P:P=1,使用预先变址寻址,否则使用过后变址寻址 U:U=1,给出的偏移量被加到基址寄存器上,否则从中减去偏移量 W:预先变址寻址,W=1,强制用作地址转换的最终地址写回基址寄存器; 过后变址寻址,W=1,在进行传送之前强制进行地址转换。 LDR{} , 字数据加载指令 31-28 25 24 23 21 19-16 15-12 11-0 NZCV 01 L P U 0 W 1 Rn Rd addr_mode 从内存中将一个32位字读取到目标寄存器Rd。 STR{} , 字数据存储指令 31-28 25 24 23 21 19-16 15-12 11-0 NZCV 01 L P U 0 W 0 Rn Rd addr_mode 将寄存器Rd中一个32位的字数据写入到一个内存单元。 LDRB{}B , 字节数据加载指令 31-28 25 24 23 21 19-16 15-12 11-0 NZCV 01 L P U 1 W 1 Rn Rd addr_mode 将一个8位字节读取到目标寄存器Rd。 STRB{}B , 字节数据存储指令 31-28 25 24 23 21 19-16 15-12 11-0 NZCV 01 L P U 1 W 0 Rn Rd addr_mode 从寄存器Rd中取出8位字节放入内存单元低8位,高位补0. LDRH{}H , 半字数据加载指令 31-28 24 23 21 19-16 15-12 11-8 4-0 NZCV 010 P U 1 W 1 Rn Rd addr_mode 1011 addr_mode 从内存将一个16位的半字读取到目标寄存器Rd。 STRH{}H , 半字数据存储指令 31-28 24 23 21 19-16 15-12 11-8 4-0 NZCV 000 P U 1 W 0 Rn Rd addr_mode 1011 addr_mode 从寄存器取出指定的16位半字放入指令中指定的内存单元的低16位,将高位补0. LDR{}T , 用户模式字加载指令 31-28 25 23 19-16 15-12 11-0 NZCV 01 L 0 U 1 1 1 Rn Rd addr_mode 从内存中将一个32位的字读取到目标寄存器Rd。 post_indexed_addressing_mode:使用后索引地址模式寻址。 STR{}T , 用户模式字存储指令 31-28 25 23 19-16 15-12 11-0 NZCV 01 L 0 U 0 1 0 Rn Rd addr_mode 将寄存器Rd中的一个32位的字写入到内存中。 post_indexed_addressing_mode:使用后索引地址模式寻址。 LDR{}BT , 用户模式字节加载指令 31-28 25 23 19-16 15-12 11-0 NZCV 01 L 0 U 1 1 1 Rn Rd addr_mode 从内存读取一个8位字节到目标寄存器Rd。 post_indexed_addressing_mode:使用后索引地址模式寻址。 STR{}BT ,, 用户模式字节存储指令 31-28 25 23 19-16 15-12 11-0 NZCV 01 L 0 U 1 1 0 Rn Rd addr_mode 将寄存器Rd中的一个8位的字节写入到内存中。 post_indexed_addressing_mode:使用后索引地址模式寻址。 LDR{}SB , 有符号字节传送指令 31-28 24 23 22 21 19-16 15-12 11-0 NZCV 000
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台