目录
一 S32I 和 L32I 指令
在 Xtensa 架构中,S32I
和 L32I
是两种用于内存访问的指令,分别用于存储和加载 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
寄存器中的值为 0x00000001
,a2
寄存器中的值为 0x00000002
,则以下指令会导致跳转:
asm
深色版本
1BNE a1, a2, 50002453 <I2C_Slave_IRQHandle+0xef>
因为 a1
和 a2
中的值不相等,所以会跳转到标签 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}