380 likes | 542 Views
ARM 指令系统. 数据传输指令. Mov 传送指令. Mov 指令将 <shift_operand> 表示的数据传送到目标寄存器 <RD> 中,并根据操作的结果更新 CPSR 中相应的条件标志位. Mov 传送指令. Mov 指令可以完成以下功能: 将数据从一个寄存器传送到另一个寄存器 将一个常数传送到一个寄存器中 当 PC 作为目标寄存器时可实现程序跳转,这种跳转可实现子程序调用以及从子程序中返回。
E N D
Mov传送指令 • Mov指令将<shift_operand>表示的数据传送到目标寄存器<RD>中,并根据操作的结果更新CPSR中相应的条件标志位
Mov传送指令 • Mov指令可以完成以下功能: • 将数据从一个寄存器传送到另一个寄存器 • 将一个常数传送到一个寄存器中 • 当PC作为目标寄存器时可实现程序跳转,这种跳转可实现子程序调用以及从子程序中返回。 • 当PC作为目标寄存器且指令中S位被设置时,指令在执行跳转的同时,将当前处理器模式的SPSR寄存器内容复制到CPSR中,这样,指令movs pc,lr可实现从某些异常中断中返回。
Mvn传送指令 • Mvn指令将<shift_operand>表示的数据的反码传送到目标寄存器<RD>中,并根据操作的结果更新CPSR中相应的条件标志位 • 指令的用途 • 向寄存器中传送一个负数 • 生成位掩码 • 求一个数的反码
Add加法指令 • Add指令将<shift_operand>表示的数据与寄存器<RD>中的值相加,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位 • 用途:实现两个操作数相加 • 例: • add rx, rx, #1 • Add rd, rx, rx, lsl #n
Adc带位加法指令 • Adc指令将<shift_operand>表示的数据与寄存器<RD>中的值相加,再加上CPSR中的C条件标志位的值,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
Adc带位加法指令 • 指令的用途 Adc指令和add指令联合使用可实现两个64位操作数的相加。 例:设寄存器r0和r1中放置一个64位源操作数,其中r0中放置低32位数值;r2和r3中放置另一个64位源操作数,其中r2中放置低32位数值,则俩个64位数的加法操作为: Adds r4, r0, r2 Adc r5, r1, r3
Sub减法指令 • Su b指令从寄存器<RN>中减去<shift_operand>表示的数据,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位 • 指令用途:实现两个操作数相减 Sub rx, rx, #1
Sbc带位减法指令 • Sub指令从寄存器<RN>中减去<shift_operand>表示的数据,再减去CPSR中的C条件标志位的反码,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
Sbc带位减法指令 • 指令的用途 sbc指令和subs指令联合使用可实现两个64位操作数的相减。 例:设寄存器r0和r1中放置一个64位源操作数,其中r0中放置低32位数值;r2和r3中放置另一个64位源操作数,其中r2中放置低32位数值,则俩个64位数的减法操作为: subs r4, r0, r2 sbc r5, r1, r3
Rsb 逆向减法指令 • rsb指令从<shift_operand>表示的数据中减去寄存器<RD>的值,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位 例: Rsb rd, rx, #0 Rsb rd, rx, rx, lsl #n
Rsc 带位逆向减法指令 • rsc指令从<shift_operand>表示的数据中减去寄存器<RD>的值,再减去CPSR中C条件标志位的反码, 并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
Rsc 带位逆向减法指令 例: 求一个64位数的负数。64位数放在寄存器r0,r1中,其负数放在r2,r3中,其中r0,r2中放低32位值 Rsbs r2, r0, #0 Rsc r3, r1,#0
And 逻辑与操作指令 • And 指令将<shift_operand>表示的数据与寄存器<RD>的值按位作逻辑与操作,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
And 逻辑与操作指令 • 指令用途 And 指令可用于提取寄存器中某些位的值。具体做法是设置一个掩码值,将该值中对应于寄存器中欲提取的位设1,其他位设为0。将寄存器的值与该掩码值作与操作。
Orr逻辑或操作指令 • orr 指令将<shift_operand>表示的数据与寄存器<RD>的值按位作逻辑或操作,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
Orr逻辑或操作指令 • 指令用途 orr指令可用于将寄存器中某些位的值置1。具体做法是设置一个掩码值,将该值中对应于寄存器中欲置位的位设1,其他位设为0。将寄存器的值与该掩码值作或操作。
eor逻辑异或操作指令 • eor指令将<shift_operand>表示的数据与寄存器<RD>的值按位作逻辑异或操作,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位
eor逻辑异或操作指令 • 用途: Eor指令可用于将寄存器中某些位的值取反。将某一位与0做异或操作,该位值不变;与1做异或操作,该位置将被求反。
Bic 位清除指令 • Bic指令将<shift_operand>表示的数据与寄存器<RD>的值的反码按位作逻辑与操作,并把结果保存在<RD>中,同时根据操作的结果更新CPSR中相应的条件标志位 • 可用于将寄存器中某些位的值设置为0。
Cmp比较指令 • Cmp指令从寄存器<RN>中减去<shifter_operand>表示的数值,根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。 • Cmp指令与subs指令的区别在于cmp指令不保存操作结果。
Cmn基于相反数的比较指令 • Tst 位测试指令 • Teq相等测试指令
Mul 32位乘法指令 • Mul实现两个32位数的乘积,并将结果存放到一个32位的寄存器中,同时根据运算结果设置CPSR中相应的条件标志位 • 由于两个32位的数相乘结果为64位,mul指令仅仅保存了结果的低32位,所以对于带符号的和无符号的操作数来说mul指令执行的结果相同。 • 寄存器为r15时,指令执行的结果不可预测
Mla • Mla实现两个32位数的乘积,再将乘积加上第3个操作数,并将结果存放到一个32位的寄存器中,同时根据运算结果设置CPSR中相应的条件标志位 • Mla r0, r1, r2, r3
Smull 64有符号数乘法指令 • smull实现两个32位有符号数的乘积,乘积结果的高32位存放到一个32位的寄存器<RDHI>中,低32位存放到另一个32位的寄存器<RDLO>中,同时根据运算结果设置CPSR中相应的条件标志位 • Smull r1, r2, r3, r4 r1=(r3*r4)低32位 r2=(r3*r4)高32位
程序状态访问指令 • 用于在状态寄存器和通用寄存器之间传送数据 • 通常修改状态寄存器是通过“读取—修改—写回”