GCC编译无符号数的除法和取余时会链接库中的符号:__aeabi_uidiv和__aeabi_uidivmod,因此可以用户定义该符号重载除法和取余运算。列出无符号数的除法代码,有符号数根据符号做变换即可。
- .cpu cortex-m4
- .syntax unified
- .thumb
- .text
- .equ HDIV_BASE, 0x40028000 /* HDIV外设基地址 */
- .global __aeabi_uidiv
- .type __aeabi_uidiv, %function
- .global __aeabi_uidivmod
- .type __aeabi_uidivmod, %function
- .type __div0, %function
- __div0:
- b __div0
- __aeabi_uidiv:
- __aeabi_uidivmod:
- cmp r1, #0 /* 判断除数为0 */
- beq __div0
- ldr r2, =HDIV_BASE
- str r0, [r2,#0x04] /* 写入被除数 */
- str r1, [r2,#0x08] /* 写入除数 */
- movs r0, #0x00000003
- str r0, [r2] /* 启动运算 */
- _while:
- ldr r1, [r2] /* r0=*HDIV_DIVIDEND */
- movs r0, #0x00000008 /* r0=0x00000008 */
- ands r0, r1 /* r0=r1&r0 */
- beq _while
- ldr r0, [r2,#0x0C] /* 读取商 */
- ldr r1, [r2,#0x10] /* 读取余数 */
- BX lr /* 返回 */
- .end
|