新闻资讯
看你所看,想你所想

ARM指令集

ARM指令集是指计算机ARM操作指令系统。在ARM中有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向PC寄存器(R15)中写入目标来自地址值。

ARM了训余黄弱双座指令集是可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、扩干加载/存储指令、协处理器指令和异常产生指令六作宪丰稳依大类。

  • 中文名称 ARM指令集
  • ADC 带进位的32位数加法
  • ADD 32位数相加
  • AND 32位数的逻辑与

指令列表

  ADC

  带进位的32位数加法

  ADD

  32位数相加

  AND

  32位数的逻辑与

  B

  在32M空间内的相对跳转指令

  BEQ

  相等来自则跳转(Branch 指明而讨燃依庆同介径if EQual)

  BNE

  不相等则跳转(Branch if Not Equal)

 决风研稳基排元线势 BGE

  大于或等于跳转在显找世需便脚准安地(Branch if Greater than or Equa)

  BGT

  大于跳转(Branch if Greater Than)

  BIC

  32位数的逻辑位清零

  BKPT

  断点指令

  BL

  带链接的相对跳转指令

  BLE

  小于或等于跳转(Branch if Less than or Equal)

  BLEQ

  带链接等于跳转(Branch with Link if EQual)

  BLLT

  带链接小于跳转(日剧蛋或赵Branch with Link if Less Than)

  BLT

  小于跳转(Branch if Less Than)

  BLX

  带链接的切换跳转

360百科  BX

  切换跳转

  CDP 至氧但训束CDP2

  协处理器数据处理操作

  CLZ

  零计数

  CMN

  比较两个数的相反数

  CMP

  32位数比较

  EOR

  32位逻辑异或

  LDC LDC2

  从协处理器取一个或多个32位值

 述异农 LDM

  从内存送多个3处球层丰均甲策呼拉2位字到ARM寄存器

  降元LDR

  从虚拟地址取一个单个的32位值

  MCR 预更须船距高看坚值路方MCR2 MCRR

  从寄存器送数据到协处理器

  MLA

  32位乘累加

  MOV

 款旧多查亲可 传送一个32位数到寄存器

  MRC MRC2 MRR存套C

  从协处理器传送数据到寄存器

  MRS

  把状态寄存器的值送到通用寄存器

  MSR

  把通用寄存器的值传送到状态寄存器

  MUL

沙垂宣  32位乘

  MVN

  把一个32位数的逻辑"非"送到寄存器

  ORR

  32位逻辑或

  PLD

  预装载提示指令

  QADD

  有符号32位饱和加

  QDADD

  有符号双32位饱和加

  QSUB

  有符号32位饱和减

  QDSUB

  有符号双32位饱和减

  RSB

策德无次运细却  逆向32位减法

  RSC

 统钟 带进位的逆向32法减底高号非载九程故似配段

  SBC

  带进位的32位减法

  SMLAxy

  有符号乘累加(16位*16位)+32位=32位

  SMLAL

  64位有符号乘累加((32位*32位)+64位=64位)

  SMALxy

  64位有符号乘累加((32位*32位)+64位=64位)

  SMLAWy

  号乘指线控卫家操飞项液言空累加((32位*16位)>>1状急字核缺已破被食6位)+32位=32位

  SMULL

  64位有符号乘累加(32位*32位)=64位

  SMULxy

  有符号乘(16位*16位=32位)

  SMULWy

  有符号乘(32位*16位>>16位=32位)

  STC STC2

  从协处理器中把一个或多个32位值存到内存

  STM

  把多个32位的寄存器值存放到内存

  STR

  把寄存器的值存到一个内存的虚地址内间

  SUB

  32位减法

  SWI

  软中断

  SWP

  把一个字或者一个字节和一个寄存器值交换

  TEQ

  等值测试

  TST

  位测试

  UMLAL

  64位无符号乘累加((32位*32位)+64位=64位)

  UMULL

  64位无符号乘累加(32位*32位)=64位

分类详解

算术和逻辑指令

  ADC(Addition with Carry) : 带进位的加法。

  定义:ADC是将把两个操作数加起来,并把结果放置到目的寄存器中。它使用一个进位标志位,这样就 可以做比 32 位大的加法。

  代码:ADC{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 + op_2 + carry

  实例:

  下列例子将加两个 128 位的数。

  128 位结果: 寄存器 0、1、2、和 3

  第一个 128 位数: 寄存器 4、5、6、和 7

  第二个 128 位数: 寄存器 8、9、10、和 11。

  ADDS R0, R4, R8 ; 加低端的字

  ADCS R1, R5, R9 ; 加下一个字,带进位

  ADCS R2, R6, R10 ; 加第三个字,带进位

  ADCS R3, R7, R11 ; 加高端的字,带进位

  注意: 如果如果要做这样的加法,不要忘记设置 S 后缀来更改进位标志。

  ADD(Addition) : 加法。

  定义:ADD 是将把两个操作数加起来,把结果放置到目的寄存器中。

  操作数1:是一个寄存器。

  操作数2:可以是一个寄存器,被移位的寄存器,或一个立即值。

  代码:ADD{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 + op_2

  实例:

   ADD R0, R1, R2 ; R0 = R1 + R2

  ADD R0, R1, #256 ; R0 = R1 + 256

  ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)

  注意:加法可以在有符号和无符号数上进行。

  AND (logical AND): 逻辑与。

  定义:AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很 有用。

  操作数1:是一个寄存器。

  操作数2:可以是一个寄存器,被移位的寄存器,或一个立即值。

  代码:AND{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 AND op_2

  实例:AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丢弃其余的位。

  真值表(二者都是 1 则结果为 1)

  op_1

  op_2

  结果

  0

  0

  0

  0

  1

  0

  1

  0

  0

  1

  1

  1

  BIC(Bit Clear) : 位清除。

  BIC 是在一个字中清除位的一种方法,与 OR 位设置是相反的操作。操作数 2 是一个 32 位位掩码(mask)。如果如果在掩码中设置了某一位,则清除这一位。未设置的掩码位指示此位保持不变。

  BIC{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 AND (!op_2)

  BIC R0, R0, #%1011 ; 清除 R0 中的位 0、1、和 3。保持其余的不变

  BIC 真值表 :

  Op_1

  Op_2

  结果

  0

  0

  0

  0

  1

  0

  1

  0

  1

  1

  1

  0

  译注:逻辑表达式为 Op_1 AND NOT Op_2

  EOR : 逻辑异或

  (logical Exclusive OR)

  EOR 将在两个操作数上进行逻辑异或,把结果放置到目的寄存器中;对反转特定的位有用。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值

  EOR{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 EOR op_2

  EOR R0, R0, #3 ; 反转 R0 中的位 0 和 1

  EOR 真值表(二者不同则结果为 1):

  Op_1

  Op_2

  结果

  0

  0

  0

  0

  1

  1

  1

  0

  1

  1

  1

  0

  MOV : 传送

  (Move)

  MOV 从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。你可以指定相同的寄存器来实现 NOP 指令的效果,你还可以专门移位一个寄存器

  MOV{条件}{S} <dest>, <op 1>

  dest = op_1

  MOV R0, R0 ; R0 = R0... NOP 指令

  MOV R0, R0, LSL#3 ; R0 = R0 * 8

  如果 R15 是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15:

  MOV PC, R14 ; 退出到调用者

  MOVS PC, R14 ; 退出到调用者并恢复标志位

  (不遵从 32-bit 体系)

  MVN : 传送取反的值

  (MoveNegative)

  MVN 从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。这是逻辑非操作而不是算术操作,这个取反的值加 1 才是它的取负的值

  MVN{条件}{S} <dest>, <op 1>

  dest = !op_1

  MVN R0, #4 ; R0 = -5

  MVN R0, #0 ; R0 = -1

  ORR : 逻辑或

  (logical OR)

  ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。  

  op2可以是寄存器、被移位的寄存器或立即数。一般用于设置Rn的特定几位。

  ORR{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 OR op_2

  ORR R0, R0, #3 ;  该指令设置R0的0、1位,其余位保持不变。

  ORR R0,R0,#5 ;R0的第0位和第2位设置为1,其余位不变

  OR 真值表(二者中存在 1 则结果为 1):

  Op_1

  Op_2

  结果

  0

  0

  0

  0

  1

  1

  1

  0

  1

  1

  1

  1

  RSB : 反向减法

  (Reverse Subtraction)

  RSB 用操作数 two 减去操作数 one,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值

  RSB{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_2 - op_1

  RSB R0, R1, R2 ; R0 = R2 - R1

  RSB R0, R1, #256 ; R0 = 256 - R1

  RSB R0, R2, R3,LSL#1 ; R0 = (R3 << 1) - R2

  例如:

  RSB R0,R1,#5 ;R0=5-R1

  RSB R0,R1,R2 ;R0=R2-R1

  RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1

  反向减法可以在有符号或无符号数上进行。

  RSC : 带借位的反向减法

  (Reverse Subtraction with Carry)

  RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

  RSC{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_2 - op_1 - !carry

  例如:

  第一个64位操作数存放在寄存器R2,R3中;

  第二个64位操作数存放在寄存器R4,R5中;

  64位结果存放在R0,R1中。

  64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:

  SUBS R0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值

  RSC R1,R5,R3; 高32位相减

  SBC : 带借位的减法

  (Subtraction with Carry)

  SBC 做两个操作数的减法,把结果放置到目的寄存器中。它使用进位标志来表示借位,这样就可以做大于 32 位的减法。SUB 和 SBC 生成进位标志的方式不同于常规,如果需要借位则清除进位标志。所以,指令要对进位标志进行一个非操作 - 在指令执行期间自动的反转此位。op2可以是寄存器、被移位的寄存器或立即数。

  SBC{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 - op_2 - !carry

  例如:

  第一个64位操作数存放在寄存器R2,R3中;

  第二个64位操作数存放在寄存器R4,R5中;

  64位结果存放在R0,R1中。

  64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:

  SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值

  SBC R1,R3,R5; 高32位相减

  SUB : 减法

  (Subtraction)

  SUB 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值

  SUB{条件}{S} <dest>, <op 1>, <op 2>

  dest = op_1 - op_2

  例如:

  SUB R0,R1,#5 ;R0=R1-5

  SUB R0,R1,R2 ;R0=R1-R2

  SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位

  SUB R0, R1, R2 ; R0 = R1 - R2

  SUB R0, R1, #256 ; R0 = R1 - 256

  SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)

  减法可以在有符号和无符号数上进行。

移位指令

  ARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你还可以使用桶式移位器影响在 LDR/STR 操作中的变址值。

  译注:移位操作在 ARM 指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。如果数据处理指令的第二个操作数是立即值,在指令中用 8 位立即值和 4 位循环移位来表示它,所以对大于 255 的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。在逻辑类指令中,逻辑运算指令由指令中 S 位的设置或清除来确定是否影响进位标志,而比较指令的 S 位总是设置的。在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。

  下面是给不同的移位类型的六个助记符:

  LSL 逻辑左移

  ASL 算术左移

  LSR 逻辑右移

  ASR 算术右移

  ROR 循环右移

  RRX 带扩展的循环右移

  ASL 和 LSL 是等同的,可以自由互换。

  你可以用一个立即值(从 0 到 31)指定移位数量,或用包含在 0 和 31 之间的一个值的寄存器指定移位数量。

  LSL/ASL : 逻辑或算术左移

  (Logical or Arithmetic Shift Left)

  接受 Rx 的内容并按用'n'或在寄存器 Rn 中指定的数量向高有效位方向移位。最低有效位用零来填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。

  LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

  Rx, LSL #n or

  Rx, ASL #n or

  Rx, LSL Rn or

  Rx, ASL Rn

  考虑下列:

  MOV R1, #12

  MOV R0, R1, LSL#2

  在退出时,R0 是 48。 这些指令形成的总和是 R0 = #12, LSL#2 等同于 BASIC 的 R0 = 12 << 2

  MOV R0, R1, LSL#2 ;将R1中的内容左移两位后传送到R0中。

  LSR : 逻辑右移

  (Logical Shift Right)

  它在概念上与左移相对。把所有位向更低有效位方向移动。如果逻辑类指令中 S 位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的 register = value >>> shift。

  LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

  Rx, LSR #n or

  Rx, LSR Rn

  操作示例:

  MOV R0, R1, LSR#2 ;将R1中的内容右移两位后传送到R0中,左端用零来填充。

转载请注明出处安可林文章网 » ARM指令集

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com