📜  微控制器的指令集

📅  最后修改于: 2022-05-13 01:57:03.418000             🧑  作者: Mango

微控制器的指令集

数据处理指令:
我们使用数据处理指令来操作寄存器中的数据。

数据处理指令的类型 –

  • 算术指令
  • 逻辑指令
  • 乘法指令
  • 比较说明
  • 移动指令

大多数数据处理指令使用 barre shifter 来预处理其操作数之一的数据。每个操作都会更新 cpsr 中的不同标志(要了解有关“CPSR”的更多信息,请搜索“CPSR in ARM”)。

让我们详细讨论说明。

1.算术说明:
算术指令主要实现 32 位有符号和无符号值的加法和减法。

语法:{}{s} Rd, Rn, N

ADCadd with 32-bit values and carryRd=Rn+N+carry
ADDadd two 32-bit valuesRd=Rn+N
RSBreverse subtract of two 32-bit valuesRd=N-Rn
RSCreverse subtract with carry of two 32-bit valuesRd=N-Rn-!(Carry flag)
SBCsubtract with carry of two 32-bit valuesRd=Rn-N-!(Carry flag)
SUBsubtract two 322-bit valuesRd=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. 逻辑指令——
逻辑指令对两个源寄存器执行按位逻辑运算。
语法:{} {S} Rd, Rn, N

ANDlogical bitwise AND of two 32-bit valuesRd = Rn & N
ORRlogical bitwise OR of two 32-bit valuesRd = Rn | N
EORlogical exclusive OR of two 32-bit valuesRd = Rn ^ N
BIClogical 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{}{S} Rd, Rm, Rs, Rn
MUL{}{S} Rd, Rm, Rs

MLAMultiply and accumulateRd = (Rm * Rs) + Rn
MULmultiplyRd = Rm * Rs

语法 – {}{S} RdLo, RdHi, Rm, Rs

SMLALsigned multiply accumulate long[RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs)
SMULLsigned multiply long[RdHi, RdLo] = Rm * Rs
UMLALunsigned multiply accumulate long[RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs)
UMULLunsigned 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 标志位,但不影响其他寄存器。设置位后,该信息可用于通过条件执行来更改程序流程。

语法 – {} Rn, N

CMNcompare negatedflags set as a result of Rn + N
CMPcompareflags set as a result of Rn – N
TEQtest for quality of two 32 – bit valuesflags set as a result of Rn ^ N
TSTtest bits of a 32-bit valueflags 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 是寄存器或立即数。该指令对于设置初始值和在寄存器之间传输数据很有用。

语法 - {}{S} Rd, N

MOVMove a 32-bit value into a registerRd = N
MVNmove the NOT of the 32-bit value into a registerRd = ~N

例子 -

r5 = 5 ;寄存器值
r7 = 8 ;寄存器值
MOV r7, r5 ;让 r7 = r5

邮政
r5 = 5 ;将 r5 数据移入 r7 后寄存器中的数据
r7 = 5 ;移动操作后的输出

桶形移位器 –
它是一种可变数量的单词移位装置。它是用于在对 ALU 操作进行操作之前预处理操作数/寄存器之一的逻辑设备之一。它是 ARM 的最佳特性之一。

桶式移位器

MnemonicsDescriptionShiftResultShift amount
LSLlogical shift leftxLSLyx<#0-31 or Rs
LSRlogical shift rightxLSRy(unsigned) x>>y#1-32 or Rs
ASRarithmetic right shiftxASRy(signed) x>>y#1-32 or Rs
RORrotate rightxRORy((unsigned) x>>y) | (x<<(32 – y)#1-31 or Rs
RRXrotate right extendedxRRX(c flag << 31) | ((unsigned) x>>1)none
x represents the register being shifted and y represent the shift amount
N shift operationsSyntax
Immediate#immediate
RegisterRm
Logical shift left by immediateRm, LSL #shift_imm
Logical shift left by registerRm, LSL Rs
Logical shift right by immediateRm, LSR #shift_imm
Logical shift right by registerRm, LSR  Rs
Arithmetic shift right by immediate Rm, ASR #shift_imm
Arithmetic shift right by registerRm, ASR Rs
Rotate right by immediateRm, ROR #shift_imm
Rotate right by registerRm, ROR Rs
rotate right with extendRm, 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 后缀存在于指令助记符中。