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
|