[综合信息] GCC下M0内核硬件除法器代码替换

[复制链接]
 楼主| 禁基的矮子 发表于 2022-9-6 07:47 | 显示全部楼层 |阅读模式
GCC编译无符号数的除法和取余时会链接库中的符号:__aeabi_uidiv和__aeabi_uidivmod,因此可以用户定义该符号重载除法和取余运算。列出无符号数的除法代码,有符号数根据符号做变换即可。

  1. .cpu cortex-m4
  2. .syntax unified
  3. .thumb
  4. .text

  5. .equ    HDIV_BASE,              0x40028000  /* HDIV外设基地址 */

  6. .global __aeabi_uidiv
  7. .type __aeabi_uidiv, %function

  8. .global __aeabi_uidivmod
  9. .type __aeabi_uidivmod, %function

  10. .type __div0, %function
  11. __div0:
  12.     b       __div0

  13. __aeabi_uidiv:
  14. __aeabi_uidivmod:

  15.     cmp     r1, #0      /* 判断除数为0 */
  16.     beq     __div0

  17.     ldr     r2, =HDIV_BASE      
  18.     str     r0, [r2,#0x04]           /* 写入被除数 */
  19.     str     r1, [r2,#0x08]           /* 写入除数 */

  20.     movs    r0, #0x00000003
  21.     str     r0, [r2]                /* 启动运算 */

  22. _while:
  23.     ldr     r1, [r2]                /* r0=*HDIV_DIVIDEND */
  24.     movs    r0, #0x00000008         /* r0=0x00000008 */
  25.     ands    r0, r1                  /* r0=r1&r0 */
  26.     beq     _while

  27.     ldr     r0, [r2,#0x0C]          /* 读取商 */
  28.     ldr     r1, [r2,#0x10]          /* 读取余数 */
  29.     BX      lr                      /* 返回 */

  30. .end



您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部