正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 arm汇编 组合和分离指令
Home android 嵌入式开发 arm汇编 组合和分离指令

arm汇编 组合和分离指令

android 嵌入式开发 by

一、  BFC  和  BFI

位域清零和位域插入 清除寄存器中相邻的位,或将一个寄存器中的相邻位插入 另一个寄存器中。

语法

BFC{ cond }  Rd , # lsb , # width 
BFI{ cond }  Rd ,  Rn , # lsb , # width

其中:

 cond  是一个可选的条件代码
 Rd  是目标寄存器。 Rd 不能为  r15 。
 Rn  是源寄存器。 Rn 不能为  r15 。
 lsb  是要清除或复制的最低有效位
 width  是要清除或复制的位数。 width 不能为  0 ,且  ( width + lsb )  必须小于 32 。

BFC

从 lsb 开始,清除 Rd 中的 width 个位。 Rd 中的其他位保持不变。

BFI

用 Rn 中从  [0]  位开始的 width 位替换 Rd 中从 lsb 开始的 width 位。 Rd 中的其他位 保持不变。

条件标记

这些指令不更改标记。

体系结构

这些  ARM  指令可用于  ARMv6T2  及更高版本。

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本。

这些指令均无  16  位  Thumb  版本。

二、SBFX  和  UBFX

有符号和无符号位域提取。 将一个寄存器中相邻的位复制到另一个寄存器的最 低有效位,并用符号或零扩展到  32  位。

语法

op { cond }  Rd ,  Rn , # lsb , # width

其中:

 op  是 SBFX 或 UBFX 。
 cond  是一个可选的条件代码
 Rd  是目标寄存器
 Rn  是源寄存器
 lsb  是位域中的最低有效位的位编码,范围从  0  到  31 。
 width  是位域宽度,范围从  1  到  (32 – lsb ) 。

不要将  r15  用作 Rd 或 Rn 。

条件标记

这些指令不更改任何标记。

体系结构

这些  ARM  指令可用于  ARMv6T2  及更高版本。

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本。

这些指令均无  16  位  Thumb  版本。

三、SXT 、 SXTA 、 UXT  和  UXTA

符号扩展、带加法的符号扩展、零扩展和带加法的零扩展。
语法
SXT< extend >{ cond } { Rd },  Rm  {, rotation } 
SXTA< extend >{ cond } { Rd },  Rn ,  Rm  {, rotation } 
UXT< extend >{ cond } { Rd },  Rm  {, rotation } 
UXTA< extend >{ cond } { Rd },  Rn ,  Rm  {, rotation }
其中:
 < extend >  是下列项之一:

  • B16      将两个 8 位值扩展为两个 16 位值。
  • B          将一个 8 位值扩展为一个 32 位值。
  • H         将一个 16 位值扩展为一个 32 位值。
 cond  是一个可选的条件代码
 Rd  是目标寄存器
 Rn  是存放要相加的值的寄存器(仅 SXTA 和 UXTA )。
 Rm  是存放要扩展的值的寄存器
 rotation  是下列项之一:

  • ROR #8     将 Rm 中的值向右循环移 8 位。
  • ROR #16    将 Rm 中的值向右循环移 16 位。
  • ROR #24   将 Rm 中的值向右循环移 24 位。
  • 如果省略 rotation ,则不执行循环移位。

不能将  r15  用于 Rd 、 Rn 或 Rm 。

操作

这些指令执行以下操作:

1、将 Rm 中的值向右循环移  0 、 8 、 16  或  24  位。

2、对所得到的值执行下列操作:

  • 提取 [7:0] 位,并用符号或零扩展到 32 位。 如果指令为扩展并相加指 令,则加上 Rn 中的值。
  • 提取 [15:0] 位,并符号或零扩展到 32 位。 如果指令为扩展并相加指 令,则加上 Rn 中的值。
  • 提取 [23:16] 位以及 [7:0] 位,并符号或零扩展到 16 位。 如果指令是 扩展并相加指令,则分别将它们加到 Rn 的 [31:16] 位和 [15:0] 位,以 形成结果的 [31:16] 位和 [15:0] 位。

条件标记

这些指令不更改标记。

16  位指令

在  Thumb  代码中使用时只有下列形式才是  16  位指令,且只有这些形式可用于 Thumb-2  之前的  Thumb  代码中:

 SXTB  Rd ,  Rm  Rd 和 Rm 必须都是  Lo  寄存器。
 SXTH  Rd ,  Rm  Rd 和 Rm 必须都是  Lo  寄存器。
 UXTB  Rd ,  Rm  Rd 和 Rm 必须都是  Lo  寄存器。
 UXTH  Rd ,  Rm  Rd 和 Rm 必须都是  Lo  寄存器。

体系结构

这些  ARM  指令可用于  ARMv6  及更高版本。

SXTA 和 UXTA  Thumb  指令可用于  ARMv6T2  及更高版本( ARMv7-M  架构除外)。

SXT 和 UXT  32  位  Thumb  指令可用于  ARMv6T2  及更高版本。

SXT 和 UXT  16  位  Thumb  指令可用于  ARMv6  及更高版本。

示例

SXTH         r3, r9, r4
    UXTAB16EQ    r0, r0, r4, ROR #16

不正确的示例

SXTH r9, r3, r2, ROR #12 ; rotation must be by 0, 8, 16, or 24.

四、PKHBT  和  PKHTB

半字组合指令。

组合两个寄存器中的半字。 可在提取半字之前,对其中一个操作数进行移位。

语法

PKHBT{ cond } { Rd },  Rn ,  Rm {, LSL # leftshift } 
PKHTB{ cond } { Rd },  Rn ,  Rm {, ASR # rightshift }

其中:

 PKHBT  将 Rn 的位  [15:0]  与移位后的 Rm 值的位  [31:16]  进行组合。
 PKHTB  将 Rn 的位  [31:16]  与移位后的 Rm 值的位  [15:0]  进行组合。
 cond  是一个可选的条件代码
 Rd  是目标寄存器
 Rn  是存放第一个操作数的寄存器
 Rm  是存放第一个操作数的寄存器
 leftshift  在  0  到  31  范围内。
 rightshift  在  1  到  32  范围内。

不要将  r15  用作 Rd 、 Rn 或 Rm 。

条件标记

这些指令不更改标记。

体系结构

这些  ARM  指令可用于  ARMv6  及更高版本。

这些  32  位  Thumb  指令可用于  ARMv6T2  及更高版本( ARMv7-M  架构除外)。

这些指令均无  16  位  Thumb  版本。

示例

PKHBT   r0, r3, r5          ; combine the bottom halfword of r3 with
; the top halfword of r5
    PKHBT   r0, r3, r5, LSL #16 ; combine the bottom halfword of r3 with
; the bottom halfword of r5
    PKHTB   r0, r3, r5, ASR #16 ; combine the top halfword of r3 with 
; the top halfword of r5

您还可通过使用不同的移位值来调整第二个操作数

不正确的示例

PKHBTEQ r4, r5, r1, ASR #8 ; ASR not permitted with PKHBT

 

28 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章