Xtensa 架构指令集 (ISA)--指令概述(一)

目录

一 S32I 和 L32I 指令

L32I 指令

指令格式

指令行为

S32I 指令

指令格式

指令行为

二 BLTU 指令

指令格式

指令行为

示例

C 语言示例

 三 BNE 指令

指令格式

指令行为

示例

C 语言示例

四 BGEU 指令

指令格式

指令行为

示例

C 语言示例

一 S32I 和 L32I 指令

在 Xtensa 架构中,S32IL32I 是两种用于内存访问的指令,分别用于存储和加载 32 位数据。

L32I 指令

L32I 指令用于从内存中加载 32 位无符号整数。

指令格式

asm

深色版本

1L32I at, bt, offset
  • at: 目标寄存器,用于存放从内存读取的数据。
  • bt: 基址寄存器,与偏移量组合以形成实际的内存地址。
  • offset: 与基址寄存器中的值相加得到实际的内存地址。

指令行为

L32I 指令从由 bt 寄存器中的值加上 offset 形成的地址处读取一个 32 位无符号整数,并将其存储到 at 寄存器中。

S32I 指令

S32I 指令用于将 32 位数据存储到内存中。

指令格式

asm

深色版本

1S32I at, bt, offset
  • at: 源寄存器,包含要存储到内存中的 32 位数据。
  • bt: 基址寄存器,与偏移量组合以形成实际的内存地址。
  • offset: 与基址寄存器中的值相加得到实际的内存地址。

指令行为

S32I 指令将 at 寄存器中的 32 位数据存储到由 bt 寄存器中的值加上 offset 形成的地址处。

二 BLTU 指令

BLTU 是 Xtensa 架构中的一个条件分支指令,代表“Branch if Less Than Unsigned”(如果无符号小于则分支)。这个指令用于基于两个寄存器中的无符号值进行比较,并在第一个值小于第二个值时进行条件跳转。

指令格式

asm

深色版本

1BLTU at, bt, label
  • at: 第一个源寄存器。
  • bt: 第二个源寄存器。
  • label: 如果 at 中的无符号值小于 bt 中的无符号值,则跳转的目标地址。

指令行为

BLTU 指令检查 at 寄存器中的无符号值是否小于 bt 寄存器中的无符号值。如果 at 中的值小于 bt 中的值,则执行跳转到指定的标签;如果 at 中的值大于等于 bt 中的值,则跳过跳转,继续执行下一条指令。

示例

假设 a1 寄存器中的值为 0x00000001(即 1),a2 寄存器中的值为 0x00000002(即 2),则以下指令会导致跳转:

asm

深色版本

1BLTU a1, a2, 50002453 <I2C_Slave_IRQHandle+0xef>

因为 a1 中的值小于 a2 中的值,所以会跳转到标签 50002453 <I2C_Slave_IRQHandle+0xef> 处的指令。

C 语言示例

在 C 语言中,这样的条件跳转可以被翻译为类似于以下的代码:

c

深色版本

1void function(void) {
2    uint32_t a1 = ...;  // 第一个值
3    uint32_t a2 = ...;  // 第二个值
4
5    if (a1 < a2) {
6        // 如果 a1 的无符号值小于 a2 的无符号值,则执行跳转
7        goto label_target;
8    }
9
10    // 继续执行其他指令
11
12    // 跳转目标
13    label_target:
14    // 这里是跳转后的代码
15}

 三 BNE 指令

BNE 是 Xtensa 架构中的一个条件分支指令,代表“Branch if Not Equal”(如果不等则分支)。这个指令用于基于两个寄存器中的值是否不等来进行条件跳转。

指令格式

asm

深色版本

1BNE at, bt, label
  • at: 第一个源寄存器。
  • bt: 第二个源寄存器。
  • label: 如果 at 和 bt 中的值不等,则跳转的目标地址。

指令行为

BNE 指令检查 at 寄存器中的值是否不等于 bt 寄存器中的值。如果它们不相等,则执行跳转到指定的标签;如果它们相等,则跳过跳转,继续执行下一条指令。

示例

假设 a1 寄存器中的值为 0x00000001a2 寄存器中的值为 0x00000002,则以下指令会导致跳转:

asm

深色版本

1BNE a1, a2, 50002453 <I2C_Slave_IRQHandle+0xef>

因为 a1a2 中的值不相等,所以会跳转到标签 50002453 <I2C_Slave_IRQHandle+0xef> 处的指令。

C 语言示例

在 C 语言中,这样的条件跳转可以被翻译为类似于以下的代码:

c

深色版本

1void function(void) {
2    int a1 = ...;  // 第一个值
3    int a2 = ...;  // 第二个值
4
5    if (a1 != a2) {
6        // 如果 a1 和 a2 的值不相等,则执行跳转
7        goto label_target;
8    }
9
10    // 继续执行其他指令
11
12    // 跳转目标
13    label_target:
14    // 这里是跳转后的代码
15}

四 BGEU 指令

BGEU 是 Xtensa 架构中的一个条件分支指令,代表“Branch if Greater Than or Equal Unsigned”(如果无符号大于等于则分支)。这个指令用于基于两个寄存器中的无符号值进行比较,并在第一个值大于等于第二个值时进行条件跳转。

指令格式

asm

深色版本

1BGEU at, bt, label
  • at: 第一个源寄存器。
  • bt: 第二个源寄存器。
  • label: 如果 at 中的无符号值大于等于 bt 中的无符号值,则跳转的目标地址。

指令行为

BGEU 指令检查 at 寄存器中的无符号值是否大于等于 bt 寄存器中的无符号值。如果 at 中的值大于等于 bt 中的值,则执行跳转到指定的标签;如果 at 中的值小于 bt 中的值,则跳过跳转,继续执行下一条指令。

示例

假设 a1 寄存器中的值为 0x00000002(即 2),a2 寄存器中的值为 0x00000001(即 1),则以下指令会导致跳转:

asm

深色版本

1BGEU a1, a2, 50002453 <I2C_Slave_IRQHandle+0xef>

因为 a1 中的值大于等于 a2 中的值,所以会跳转到标签 50002453 <I2C_Slave_IRQHandle+0xef> 处的指令。

C 语言示例

在 C 语言中,这样的条件跳转可以被翻译为类似于以下的代码:

c

深色版本

1void function(void) {
2    uint32_t a1 = ...;  // 第一个值
3    uint32_t a2 = ...;  // 第二个值
4
5    if (a1 >= a2) {
6        // 如果 a1 的无符号值大于等于 a2 的无符号值,则执行跳转
7        goto label_target;
8    }
9
10    // 继续执行其他指令
11
12    // 跳转目标
13    label_target:
14    // 这里是跳转后的代码
15}
  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值