在 32 位字体系结构中检查特定位状态的最佳方法是什么?

What's the best way to check the state of a certain bit, in a 32-bit word architecture?

在大学实验室中,我们使用 TI6713 处理器进行信号处理。我经常发现自己处于需要根据位于 32 位寄存器之一的标志位执行操作的位置。其中一些标志在更改时会触发中断,而有些则不会。

到目前为止,我已经能够通过左右移动直到感兴趣的位最不重要并扩展符号来完成我的工作。例如:

SHL A0, 14, A0 ;Shift the 17th bit 14 times left
SHR A0, 31, A0 ;Shift the bit 31 times right
[A0] B LOOP ;Branch if it's not 0

其中 A0 包含标志位 17。问题是我需要更改寄存器或使用更多寄存器(可能已经在使用中)。此外,我必须计算出我必须做的移动量,虽然它相当简单,但我通常没有心情去执行它。说明指南很庞大,到目前为止我还没有找到适合我需要的说明。

是否有 better/more 可靠的方法来执行此任务?

我对 TMS320C6713x 及其 VelociTI 架构完全陌生,但通常 DSP 具有处理位字段的指令。
在这种情况下,我找到了这些:

  • ext 提取一个位域并在 32 位寄存器中对其进行符号扩展。
  • extu 同上但零扩展。
  • clr清除一个位域。
  • set 设置一个位域。

ext/u 指令的工作方式与您的代码完全相同(左移后右移),以至于直接操作数相同。

提取第 17 位的可能代码(注意第 17 位是第 18 位)可能是:

EXT A0, 14, 31, A0
[A0] B LOOP

请注意此代码未经测试。

CLRSET 可用于分别清除和设置一组位。
操作数比 ext/u 操作数更直接,它们是位域的 LSb 和 MSb(均包含在内)。

CLR A0, 0, 3, A0   ;Clear the lowest nibble of A0
SET A0, 4, 7, A0   ;Set the high nibble of the lowest byte of A0

正如评论中所建议的,AND 也可以,但是如果我正确理解了数据表,您只能使用寄存器-寄存器或寄存器-立即数 AND,其中立即数是 5位.
因此,要提取第 4 位以上的位,您需要预加载一个寄存器。