Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 什么';在32位字体系结构中,检查特定位状态的最佳方法是什么?_Assembly_Bit - Fatal编程技术网

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

Assembly 什么';在32位字体系结构中,检查特定位状态的最佳方法是什么?,assembly,bit,Assembly,Bit,在一所大学的实验室里,我们使用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 ;Br

在一所大学的实验室里,我们使用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。问题是我需要修改寄存器,或者使用更多的寄存器(可能已经在使用)。此外,我需要做的移位量也必须经过计算,虽然这相当简单,但我通常没有心情去做。教学指南非常丰富,到目前为止,我还没有找到适合我需要的教学

有没有更好/更可靠的方法来执行此任务?

我对TMS320C6713x及其VelociTI体系结构完全陌生,但DSP通常有处理位字段的指令。
在这种情况下,我发现了以下几点:

  • ext
    提取位字段,并在32位寄存器中对其进行符号扩展
  • extu
    与上面相同,但零扩展它
  • clr
    清除位字段
  • 设置
    设置位字段
ext/u
指令的工作原理与您的代码完全相同(先左移后右移),直到立即数操作数相同为止

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

EXT A0, 14, 31, A0
[A0] B LOOP
注意:此代码未经测试

CLR
SET
分别用于清除和设置一组位。
操作数比
ext/u
操作数更简单,它们是位字段的LSb和MSb(包括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
如注释所示,
也可以,但如果我正确理解了数据表,您只能使用寄存器寄存器或寄存器立即数和,其中立即数为5位。

因此,要提取位4以上的位,您需要预加载一个寄存器。

您不能在处理器寄存器中放置一个位掩码,然后
将其与控制寄存器一起使用吗?@WeatherVane That。这是一个很好的主意,我真希望我自己也这么想。谢谢你完整而清晰的回答,我会从现在开始使用它@Vlassifo很乐意帮忙。请注意代码,因为这是我第一次看到TI6713