1

我有一个 [0,5000) 范围内的整数数组,我想在汇编中将它们分成 5 个间隔 ([0,1000)、[1000,2000)、...、[4000,5000))。我使用了一种虽然正确但仍有改进空间的方法:

sltiu $t2, $t0, 1000 ; array element in $t0, compare to 1000
;...
bne $t2, $zero, condition ; if $t0 was in the interval done

剩下的就这样走了。这导致,在最坏的情况下,5 家分店出现各种不可避免的摊位。我想采用一种方法,将掩码应用于数组元素,这将根据值是否属于感兴趣的区间而产生不同的位模式。然后,我将使用位模式的值跳转到一个数组位置(用 保留.space),在该位置我将 +1 用于相关间隔(伪代码):

daddi $v0, $zero, array_of_interval_hits
; loop
xor $t3, $t0, mask   ; $t0 contains the array element
lwu $t4,  array_of_interval_hits($t3)
daddi $t4, $t4, 1
sw $t4, array_of_interval_hits($t3)

有这样的面具吗?

PS:如果数字> = 5000或数字< 0我必须(打印一条消息并)退出 - 使用无符号算术我只关心案例编号> = 5000(负数是2的补码中的大正数)

4

2 回答 2

0

我对 mips 汇编不熟悉,所以我不会进入具体的机器指令。我的想法是不使用掩码,而只是将您的数字除以(整数除而不是浮点除)1000。您可以使用结果0, 1, 2, ...来确定跳转的位置。

因此,例如数组中 0 - 999 之间的数字将给出 0 的结果;数组编号 1000 - 1999 的结果为 1;等等

处理您的 PS - 任何否定结果(假设有符号除法操作),您可以跳转到正确的处理程序。与 5 或更多的任何结果相同。

于 2013-05-12T15:24:19.997 回答
0

好吧,我认为不存在这样的掩码 - 如果有人提出解决方案,请发布并接受但暂时关闭它(对于我的编程问题的解决方案,请参阅我的评论:Assembly - bit mask for non power of two interval )

于 2014-07-15T13:41:01.490 回答