本文共 2807 字,大约阅读时间需要 9 分钟。
00. 目录
文章目录
01. 数据操作指令概述
数据操作指令是指对存放在寄存器中的数据进行操作的指令。主要包括数据传送指令、算术指令、逻辑指令、比较与测试指令及乘法指令。
如果在数据处理指令前使用 S 前缀,指令的执行结果将会影响 CPSR 中的标志位。数据处理指令如表 3-6 所示。
02. RSC指令
RSC(Reverse Subtract with Carry)指令从寄存器 shifter_operand 中减去 Rn 表示的数值,再减去寄存器 CPSR 中 C 条件标志位的反码[NOT(Carry Flag)],并将结果保存到目标寄存器 Rd 中,并根据指令的执行结果设置 CPSR 中相应的标志位。
2.1 指令的语法格式
RSC{}{S} , ,
2.2 应用示例一
@ 下面的程序使用 RSC 指令实现求 64 位数值的负数。RSBS R2,R0,#0RSC R3,R1,#0
03. TST测试指令
TST(Test)测试指令用于将一个寄存器的值和一个算术值进行比较。条件标志位根据两个操作数做“逻辑与”后的结果设置。
3.1 指令的语法格式
TST{} ,
3.2 应用示例一
TST 指令类似于 CMP 指令,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用 TST 指令来检查是否设置了特定的位。操作数 1 是要测试的数据字,而操作数 2 是一个位掩码。经过测试后,如果匹配则设置 Zero标志,否则清除它。与 CMP 指令一样,该指令不需要指定 S 后缀。下面的指令测试在 R0 中是否设置了位 0。
TST R0, #1
04. TEQ指令
TEQ(Test Equivalence)指令用于将一个寄存器的值和一个算术值做比较。条件标志位根据两个操作数做“逻辑异或”后的结果设置。以便后面的指令根据相应的条件标志来判断是否执行。
4.1 指令的语法格式:
TEQ{} ,
4.2 应用示例一
@ 下面的指令是比较 R0 和 R1 是否相等,该指令不影响 CPSR 中的 V 位和 C 位。TEQ R0,R1
TST 指令与 EORS 指令的区别在于 TST 指令不保存运算结果。使用 TEQ 进行相等测试,常与 EQ 和 NE 条件码配合使用,当两个数据相等时,条件码 EQ 有效;否则条件码NE 有效。
05. CMP 指令
CMP(Compare)指令使用寄存器 Rn 的值减去 operand2 的值,根据操作的结果更新CPSR 中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。
CMP 指令允许把一个寄存器的内容与另一个寄存器的内容或立即值进行比较,更改状态标志来允许进行条件执行。它进行一次减法,但不存储结果,而是正确地更改标志位。标志位表示的是操作数 1 与操作数 2 比较的结果(其值可能为大于、小于、相等)。如果操作数 1 大于操作数 2,则此后的有 GT 后缀的指令将可以执行。显然,CMP 不需要显式地指定 S 后缀来更改状态标志。
5.1 指令语法格式
CMP{} ,
5.2 应用示例一
@ 比较 R1 和立即数 10 并设置相关的标志位。CMP R1,#10
5.3 应用示例二
@ 比较寄存器 R1 和 R2 中的值并设置相关的标志位。CMP R1,R2
通过上面的例子可以看出,CMP 指令与 SUBS 指令的区别在于 CMP 指令不保存运算结果,在进行两个数据大小判断时,常用 CMP 指令及相应的条件码来进行操作。
06. CMN 指令
CMN(Compare Negative)指令使用寄存器 Rn 的值减去 operand2 的负数值(加上operand2),根据操作的结果更新 CPSR 中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。
6.1 指令的语法格式
CMN{} ,
6.2 应用示例一
CMN 指令将寄存器 Rn 中的值加上 shifter_operand 表示的数值,根据加法的结果设置CPSR 中相应的条件标志位。寄存器 Rn 中的值加上 shifter_operand 的操作结果对 CPSR 中条件标志位的影响,与寄存器 Rn 中的值减去 shifter_operand 的操作结果的相反数对 CPSR中条件标志位的影响有细微差别。当第 2 个操作数为 0 或者为 0x80000000 时,两者结果不同。比如下面两条指令。
@ 第 1 条指令使标志位 C 值为 1,第 2 条指令使标志位 C 值为 0。CMP Rn,#0CMN Rn,#0
6.3 应用示例二
@ 下面的指令使 R0 值加 1,判断 R0 是否为 1 的补码,若是,则 Z 置位。CMN R0,#1
07. ORR 指令
ORR(Logical OR)为逻辑或操作指令,它将第 2 个源操作数 shifter_operand 的值与寄存器 Rn 的值按位做“逻辑或”操作,结果保存到 Rd 中。
7.1 指令的语法格式
ORR{}{S} , ,
7.2 应用示例一
@ 设置 R0 中位 0 和 1。ORR R0, R0, #3
7.3 应用示例二
@ 将 R0 的低 4 位置 1。ORR R0,R0,#0x0F
7.2 应用示例一
@ 使用 ORR 指令将 R2 的高 8 位数据移入到 R3 的低 8 位中。MOV R1,R2,LSR #4ORR R3,R1,R3,LSL #8
08. BIC位清零指令
BIC(Bit Clear)位清零指令,将寄存器 Rn 的值与第 2 个源操作数 shifter_operand 的值的反码按位做“逻辑与”操作,结果保存到 Rd 中。
8.1 指令的语法格式
BIC{}{S} , ,
8.2 应用示例一
@ 清除 R0 中的位 0、1 和 3,保持其余的不变。BIC R0, R0, #0b1011
8.3 应用示例二
@ 将 R3 的反码和 R2 做“逻辑与”操作,结果保存到 R1 中。BIC R1,R2,R3
09. 附录
11.1 ARM Architecture Reference Manual
转载地址:https://dengjin.blog.csdn.net/article/details/106794861 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!