微控制器的指令集
数据处理指令:
我们使用数据处理指令来操作寄存器中的数据。
数据处理指令的类型 –
- 算术指令
- 逻辑指令
- 乘法指令
- 比较说明
- 移动指令
大多数数据处理指令使用 barre shifter 来预处理其操作数之一的数据。每个操作都会更新 cpsr 中的不同标志(要了解有关“CPSR”的更多信息,请搜索“CPSR in ARM”)。
让我们详细讨论说明。
1.算术说明:
算术指令主要实现 32 位有符号和无符号值的加法和减法。
语法:ADC add with 32-bit values and carry Rd=Rn+N+carry ADD add two 32-bit values Rd=Rn+N RSB reverse subtract of two 32-bit values Rd=N-Rn RSC reverse subtract with carry of two 32-bit values Rd=N-Rn-!(Carry flag) SBC subtract with carry of two 32-bit values Rd=Rn-N-!(Carry flag) SUB subtract two 322-bit values Rd=Rn-N N is the result of the shift operation.
例子 -
1 .这个简单的减法指令从寄存器 r1 中存储的值中减去寄存器 r2 中存储的值。结果存储在寄存器 r0 中
预
r0 = 0x00000000 ;由于这个寄存器是一个保存输出的寄存器,所以在执行之前它是空的
r1 = 0x000000002;寄存器 r1 保存值“2”
r2 = 0x000000001; r2 保存另一个值“1”
SUB r0, r1, r2 ; r0=r1 – r2。这里减去的值 (r0 – r1) 在执行操作后移动到 r0。
邮政
r0 = 0x00000001;这是上述指令的输出移动到 r0 寄存器
2. 此反向减法指令 (RSB) 从常数值 #0 中减去 r1,将结果写入 r0。
反向减法对整数值很有帮助,因此可以不复杂地减去指令。
预
r0 = 0x00000000 ;输出寄存器
r1=0x00000077;要反向减去的值
RSB r0, r1, #0 ; Rd = 0x- - r1
邮政
r0 = -r1 = 0xffffff89 ;生成反向输出并存储在寄存器 r0 中
使用带有算术指令的桶形移位器 –
桶式移位是 ARM 指令集的强大功能之一。
它在对其执行操作之前预处理操作数/寄存器之一。
例子 -
预
r0 = 0x00000000
r1 = 0x00000005
添加 r0, r1, r1, LSL #1
邮政
r0 = 0x0000000f
r1 = 0x00000005
2. 逻辑指令——
逻辑指令对两个源寄存器执行按位逻辑运算。
语法:AND logical bitwise AND of two 32-bit values Rd = Rn & N ORR logical bitwise OR of two 32-bit values Rd = Rn | N EOR logical exclusive OR of two 32-bit values Rd = Rn ^ N BIC logical bit clear (AND NOT) Rd = Rn &~ N
例子 -
1. 此示例显示了寄存器 r1 和 r2 之间的逻辑或运算,r0 保存结果。
预
r0 = 0x00000000
r1 = 0x02040608
r2 = 0x10305070
ORR r0, r1, r2
邮政
r0 = 0x12345678
2. 此示例显示了称为 BIC 的更复杂的逻辑指令,它执行逻辑位清除。
预
r1 = 0b1111
r2 = 0b0101
BIC r0, r1, r2
邮政
r0 = 0b1010
3. 乘法指令 –
乘法指令根据指令将一对寄存器的内容相乘,并将结果与另一个寄存器一起累加。长乘法累加到一对表示 64 位值的寄存器上。最终结果放置在目标寄存器或寄存器对上。
语法 – MLA{
MUL{MLA Multiply and accumulate Rd = (Rm * Rs) + Rn MUL multiply Rd = Rm * Rs
语法 – SMLAL signed multiply accumulate long [RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs) SMULL signed multiply long [RdHi, RdLo] = Rm * Rs UMLAL unsigned multiply accumulate long [RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs) UMULL unsigned multiply long [RdHi, RdLo] = Rm * Rs
处理器实现处理执行乘法指令所需的周期数。
示例 1——
- 此示例表示将寄存器 r1 和 r2 相乘并将结果放入寄存器 r0 的简单乘法指令。
- 寄存器 r1 等于值 2,r2 等于 2,然后替换为 r0。
预
r0 = 0x00000000 ;寄存器保持输出
r1 = 0x00000002;保存操作数 1 值的寄存器
r2 = 0x00000002;保存操作数 2 值的寄存器
MUL r0, r1, r2 ; r0 = r1 * r2
邮政
r0 = 0x00000004;乘法运算的输出
r1 = 0x00000002
r2 = 0x00000002;操作数
示例 2——
预
r0 = 0x00000000
r1 = 0x00000000
r2 = 0xf0000002
r3 = 0x00000002
UMULL r0, r1, r2, r3 ; [r1, r0] = r2 * r3
邮政
r0 = 0xe0000004; = RdLo
r1 = 0x00000001; = RdHi
4. 比较说明——
这些指令用于比较或测试具有 32 位值的寄存器。它们根据结果更新 cpsr 标志位,但不影响其他寄存器。设置位后,该信息可用于通过条件执行来更改程序流程。
语法 – CMN compare negated flags set as a result of Rn + N CMP compare flags set as a result of Rn – N TEQ test for quality of two 32 – bit values flags set as a result of Rn ^ N TST test bits of a 32-bit value flags set as a result of Rn & N N is the result of the shifter operation.
例子 -
预
cpsr = nzcvqift_USER
r0 = 4 ;要比较的寄存器
r9 = 4 ;要比较的寄存器
CMP r0, r9
邮政
cpsr = nzcvqift_USER 比较后生成的输出
5. 移动指令 –
移动是最简单的 ARM 指令。它将 N 复制到目标寄存器 Rd 中,其中 N 是寄存器或立即数。该指令对于设置初始值和在寄存器之间传输数据很有用。
语法 - MOV Move a 32-bit value into a register Rd = N MVN move the NOT of the 32-bit value into a register Rd = ~N
例子 -
预
r5 = 5 ;寄存器值
r7 = 8 ;寄存器值
MOV r7, r5 ;让 r7 = r5
邮政
r5 = 5 ;将 r5 数据移入 r7 后寄存器中的数据
r7 = 5 ;移动操作后的输出
桶形移位器 –
它是一种可变数量的单词移位装置。它是用于在对 ALU 操作进行操作之前预处理操作数/寄存器之一的逻辑设备之一。它是 ARM 的最佳特性之一。
Mnemonics | Description | Shift | Result | Shift amount |
LSL | logical shift left | xLSLy | x<#0-31 or Rs | |
LSR | logical shift right | xLSRy | (unsigned) x>>y | #1-32 or Rs |
ASR | arithmetic right shift | xASRy | (signed) x>>y | #1-32 or Rs |
ROR | rotate right | xRORy | ((unsigned) x>>y) | (x<<(32 – y) | #1-31 or Rs |
RRX | rotate right extended | xRRX | (c flag << 31) | ((unsigned) x>>1) | none |
x represents the register being shifted and y represent the shift amount |
N shift operations | Syntax |
Immediate | #immediate |
Register | Rm |
Logical shift left by immediate | Rm, LSL #shift_imm |
Logical shift left by register | Rm, LSL Rs |
Logical shift right by immediate | Rm, LSR #shift_imm |
Logical shift right by register | Rm, LSR Rs |
Arithmetic shift right by immediate | Rm, ASR #shift_imm |
Arithmetic shift right by register | Rm, ASR Rs |
Rotate right by immediate | Rm, ROR #shift_imm |
Rotate right by register | Rm, ROR Rs |
rotate right with extend | Rm, RRX |
示例——
- 此 MOVS 指令示例将寄存器 r1 左移一位。
- 这将寄存器 r1 乘以值 2 1
预
cpsr = nzcvqiFt_USER
r0 = 0x00000000
r1 = 0x80000004
MOVS r0, r1, LSL #1
邮政
cpsr = nzCvqiFt_USER
r0 = 0x00000008
r1 = 0x80000004
- C 标志在 CPSR 中更新,因为 S 后缀存在于指令助记符中。