Assembly 在汇编中编写一个子例程,用0替换绝对值大于正值X的序列元素

Assembly 在汇编中编写一个子例程,用0替换绝对值大于正值X的序列元素,assembly,arm64,Assembly,Arm64,我必须在汇编中编写一个子例程,用0替换绝对值大于正值X的序列元素,返回修改的元素数,但我不知道如何开始。有人能帮忙吗 所以我实际上开发了一个代码,我们有一个输入来测试它是否运行良好。输入是{7,-8,-23,56,20,-10,0,40},因为输出应该是3个元素被修改了,但是当我运行它时,我的输出说只有2个元素被修改了,即使当我读取结果向量时,我得到{7,-8,0,0,20,-10,0,0},这意味着3个元素实际上被修改了 输入:{7,-8,-23,56,20,-10,0,40} 输出:{7,-

我必须在汇编中编写一个子例程,用0替换绝对值大于正值X的序列元素,返回修改的元素数,但我不知道如何开始。有人能帮忙吗

所以我实际上开发了一个代码,我们有一个输入来测试它是否运行良好。输入是{7,-8,-23,56,20,-10,0,40},因为输出应该是3个元素被修改了,但是当我运行它时,我的输出说只有2个元素被修改了,即使当我读取结果向量时,我得到{7,-8,0,0,20,-10,0,0},这意味着3个元素实际上被修改了

输入:{7,-8,-23,56,20,-10,0,40} 输出:{7,-8,0,0,20,-10,0,0},计数=2实际值 所需输出:{未知,未指定X},计数=3 以下是我开发的汇编代码:

CheckABS:
        MOV W4, #0
        CBZ W1, FIM


Ciclo:  LDR W3, [X2], 4
        CMP W3, W0 //bigger than superior limit?
        B.GT NOK
        CMN W3, W0 //lower than inferior limit?
        B.LT NOK
        B OK

NOK:
        STR XZR, [X2, -4]
        ADD W4, W4, 1
OK:
        SUBS W1, W1, 1
        B.NE Ciclo

FIM:    MOV W0, W4
        ret

数据显然是一个32位单词int的数组,但是STR XZR,[X2,-4]是一个64位存储,因为您使用的是64位寄存器XZR。因此,它不仅覆盖了要替换为0的32位字,还覆盖了下面的一个字。我认为您需要STR WZR,[X2,-4]。

假设x86-64使用32位浮点元素,abs只是使用andps清除MSB,您可以使用cmpltps获得比较向量。带有SIMD比较结果的andps将使原始向量的元素为零,并将其存储回内存。要计算替换次数,可以使用psubd xmm5、xmm0累积计数count-=-1或0,并在结束时对其进行hsum。或者,同样的想法也适用于带有SSSE3 pabsd和pcmpgtd的integer。如果x86 SSE2指令不是您想要的编写方式,那么您的问题应该包括关于什么是ISA的详细信息,以及一次尝试。从已经起作用的东西开始,即使它没有达到您想要的效果。例如,在数组/序列上查找最小值、最大值或和。