📄 u_div32.asm
字号:
;******************************************************************************
;* U_DIV32.ASM - 32 BIT STATE - v2.24 *
;* Copyright (c) 1996-2002 Texas Instruments Incorporated *
;******************************************************************************
;****************************************************************************
;* U_DIV/U_MOD - DIVIDE TWO UNSIGNED 32 BIT NUMBERS.
;*
;****************************************************************************
;*
;* o DIVIDEND IS IN r0
;* o DIVISOR IS IN r1
;*
;* o QUOTIENT IS PLACED IN r1
;* o REMAINDER IS PLACED IN r0
;*
;* o DIVIDE BY ZERO RETURNS ZERO
;*
;****************************************************************************
.state32
.global U_DIV
.global U_MOD
dvs .set r2 ; WORK COPY OF THE DIVISOR (SHIFTED)
quo .set lr ; WORK COPY OF THE QUOTIENT
U_DIV:
U_MOD: STMFD sp!, {dvs, lr} ; SAVE CONTEXT
MOVS dvs, r1 ; CHECK FOR DIVISION BY ZERO
BEQ div_by_zero ;
MOV quo, #0 ; INITIALIZE THE QUOTIENT
CMP dvs, r0, LSR #16 ; CALCULATE THE MAXIMUM DIVISOR
MOVLS dvs, dvs, LSL #16 ; SHIFT AMOUNT WITH PSEUDO BINARY
CMP dvs, r0, LSR #8 ; SEARCH.
MOVLS dvs, dvs, LSL #8 ;
CMP dvs, r0, LSR #1 ; NOW FIND EXACTLY WHERE THE SHIFTED
BHI mod1 ; DIVISOR SHOULD BE SO THAT WE CAN
CMP dvs, r0, LSR #2 ; JUMP INTO THE CORRECT LOCATION
BHI mod2 ; OF THE UNROLLED DIVIDE LOOP.
CMP dvs, r0, LSR #3 ;
BHI mod3 ;
CMP dvs, r0, LSR #4 ;
BHI mod4 ;
CMP dvs, r0, LSR #5 ;
BHI mod5 ;
CMP dvs, r0, LSR #6 ;
BHI mod6 ;
CMP dvs, r0, LSR #7 ;
BHI mod7 ;
divl: ; DIVIDE LOOP UNROLLED 8 TIMES
CMP r0, dvs, LSL #7 ; IF DIVIDEND IS LARGER THAN DIVISOR,
ADC quo, quo, quo ; SHIFT A 1 INTO THE QUOTIENT AND
SUBCS r0, r0, dvs, LSL #7 ; SUBTRACT THE DIVISOR, ELSE SHIFT A 0.
CMP r0, dvs, LSL #6 ;
mod7: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #6 ;
CMP r0, dvs, LSL #5 ;
mod6: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #5 ;
CMP r0, dvs, LSL #4 ;
mod5: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #4 ;
CMP r0, dvs, LSL #3 ;
mod4: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #3 ;
CMP r0, dvs, LSL #2 ;
mod3: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #2 ;
CMP r0, dvs, LSL #1 ;
mod2: ADC quo, quo, quo ;
SUBCS r0, r0, dvs, LSL #1 ;
mod1: CMP r0, dvs ;
ADC quo, quo, quo ;
SUBCS r0, r0, dvs ;
CMP r1, dvs ; IF THERE IS SHIFTED DIVISOR, THEN
MOVCC dvs, dvs, LSR #8 ; CONTINUE THE LOOP.
BCC divl ;
MOV r1, quo ; ELSE WE ARE DONE. PLACE THE QUOTIENT
LDMFD sp!, {dvs, pc} ; IT ITS RIGHT PLACE.
div_by_zero:
MOV r0, #0 ; DIVIDE BY ZERO RETURNS ZERO
LDMFD sp!, {dvs, pc} ;
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -