c - ARMv7 汇编函数中查找数组最大元素时出现总线错误

标签 c assembly raspberry-pi arm armv7

我在尝试编写 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/

相关文章:

linux - 在 ARM-OABI 上实现 syscall()。什么是 "svc#0x900071"?

linux - 使用 NASM Assembly 在堆栈中打印数字

python - 可听错误 - Python 日志记录模块的自定义非阻塞文本到语音处理程序

c - 关于 malloc,这个变量指向什么?

c - putch() 和 putchar() 有什么区别?

C:使用指针修改数组中的 const 数据

程序集引导加载程序未跳转到内核

c - 如何将文件中的值包含到代码中

python - 在挂载 Raspberry Pi 时自动将文件复制到 USB

python - 使用Python从MCP23017获取信息