我在尝试编写 ARMv7 汇编函数时遇到问题。函数如下。
.global maxF32
// float maxF32(const float x[], uint32_t count)
// returns the maximum value in the array (x) containing count entries
/* R0 = float x[], R1 = uint32_t count */
maxF32:
CMP R1, #0 @ SET FLAGS OF COUNT
BEQ maxF32_end @ IF COUNT == 0, GO TO END
MOV R2, R0 @ COPY R0 INTO R2
MOV R0, #0 @ ZERO OUT R0
MOV R3, #0 @ ZERO OUT R3
MOV S0, R0 @ ZERO OUT S0
MOV S1, R0 @ ZERO OUT S1
MOV S2, R0 @ ZERO OUT S2
B maxF32_loop @ BRANCH TO LOOP
maxF32_loop:
CMP R1, #0 @ CHECK IF COUNT == 0
BEQ maxF32_end @ IF SO, GO TO END
VLDR.F32 S0, [R2] @ LOAD CURRENT ELEMENT INTO S0
ADD R2, R2, #4 @ INCREMENT VECTOR POINTER
VLDR.F32 S1, [R2] @ LOAD NEXT ELEMENT INTO S1
SUB R1, R1, #1 @ DECREMENT COUNT
CMP S0, S1 @ SET FLAGS; CHECK S0 - S1
BMI maxF32_update @ IF RESULT IS NEGATIVE (S1 > S0), GO TO UPDATE GREATEST
B maxF32_loop @ REPEAT LOOP
maxF32_update:
VMOV R3, R1, S1 @ MOVE GREATER INTO GREATEST REGISTER
B maxF32_loop @ GO BACK TO LOOP
maxF32_end:
MOV R0, R3 @ COPY GREATEST INTO R0
BX LR @ RETURN
我使用以下 C 代码进行测试:
extern float maxF32(const float x[], uint32_t count);
#define COUNT 3
float x[] = {1.2, 1.3, 1.4};
float result;
result = maxF32(x, COUNT);
printf("result is %lf\n", result);
使用 gdb,在数组的倒数第二个或最后一个循环周围,我在 CMP S0, S1
行周围收到“总线错误”。有时我还会在 MOV R3, R1, S1
处得到一个“预期逗号”,这让我很困惑,因为我不知道在哪里需要额外的逗号。
最后一点,我正在 Raspberry Pi Model 3 B+ 上进行编码。
感谢您的所有帮助。
最佳答案
计数到“3”时,您将 s0 与 s1 比较 3 次...这意味着您在数组中查找四个元素。 (对于 n
元素,您实际上应该只进行 n-1
比较)
逻辑...
decrement count
cmp element0 element1 ... loop
decrement count
compare element1 element2 ... loop
decrement count
compare element2 with 'bus error' -- nothing there.
将 SUB R1, R1, #1
移动到 maxF32_loop:
之后的第一行可能会修复它,因为它将减量放在检查计数是否为 0 之前。
关于c - ARMv7 汇编函数中查找数组最大元素时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957166/