1

我在 RISC-V RARS 1.3 应用程序中创建的这个程序旨在获取一个十进制数并计算该数字中有多少位。我正在测试的是十进制数 5,这个程序应该适用于我放在 t1 上的任何正数。这是我创建的代码。该程序旨在每当 AND 函数的结果不为 0 时添加一个计数器,但我遇到的问题是程序没有停止。这个问题有解决方案吗?

_start:

li t1,2 # start with decimal 5, binary 101
li t2,1 # adding counter for AND function
li t3,0 # bit counter count
li t4,0 # to compare 0

and t5,t1,t2 # t1 & t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0

label:
addi t3,t3,1 # add one to bit count
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0

label2:
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5

.data
4

2 回答 2

0

由于您在每次迭代中开始t2 = 1并乘以它,2因此一旦 的值t2变得大于,您应该停止计算t1

另外,在您的代码中,我看到您可能打算处理两种情况:

  1. label:- 此块处理当前测试位为 1 的情况,它增加位数,然后跳转到labellabel2。在这里,您只需要添加上面提到的退出条件
  2. label2:- 此块处理当前测试位为 0 的情况,它不会更改位数,但似乎也不会继续使用labelor label2。我认为应该继续查看是否有更高的 1 位,直到t2>t1达到退出条件。
于 2020-09-24T23:56:36.160 回答
0

如果 RISC-V 没有有效计算设置位数的指令(现在大多数其他 CPU 都有);那么下一个最好的方法是:

    // Value is 32 pieces with 1 bit per piece

    temp1 = (value & 0x555555555) + (value & 0xAAAAAAAA) >> 1;

    // Temp1 is 16 pieces with 2 bits per piece

    temp2 = (temp1 & 0x33333333) + (temp1 & 0xCCCCCCCC) >> 2;

    // Temp2 is 8 pieces with 4 bits per piece

    temp3 = (temp2 & 0x0F0F0F0F) + (temp2 & 0xF0F0F0F0) >> 4;

    // Temp3 is 4 pieces with 8 bits per piece

    temp4 = (temp3 & 0x00FF00FF) + (temp3 & 0xFF00FF00) >> 8;

    // Temp4 is 2 pieces with 16 bits per piece

    result = (temp4 & 0x0000FFFF) + (temp2 & 0xFFFF0000) >> 16;

    // Result is the count of all bits that were set in value (or, sum of all 32 of the original 1-bit values)

我不知道如何在 RISC-V 程序集中编写它(我会编译它然后剪切并粘贴生成的程序集,但也没有 RISC-V 的编译器)。

于 2020-09-25T02:38:19.180 回答