;==================================================
;32位除以16位结果为16位,结果放在Y0中,清0,累加器A
;入口参数:被除数在A,Y0中,除数在X0中
;出口:结果在A,Y0中
;说明:32位除以16位的运算中,结果为16位或32位
;=================================================
div_32by16:
cmp #$0000,x0
beq error_diver
cmp #1,x0
beq diver_return
bra right_diver
error_diver:
move #$ffffffff,a
move #$ffff,y0
diver_return:
rts
right_diver:
move a0,a1
move y0,a0
brset #$8000,a1,diver_ok
brset #$8000,x0,diver_ok
bra run_diver
diver_ok:
asr a
bfclr #$8000,a1
asr x0
bfclr #$8000,x0
run_diver:
move a1,y1
cmp x0,y1
bcc overflow_deal
;正整数除法,余数必须右移
move #$3ffe,y1 ;本来在这里可以用4000乘的
mpysu x0,y1,b ;但用4002可以提高运算精度
asr b ;
bfclr #$8000,b1
move b0,y0 ;
move b1,y1 ;
clr b ;
tfr a,b ;
asr b
bfclr #$8000,b1 ;
bfclr #$0001,sr ;
sbc y,b ;比较并转移
bcs continue_diver
over_flow:
asr a
bfclr #$8000,a1 ;
asl a ;
bfclr #$0001,sr
rep #16 ;
div x0,a
clr a1
asl a
move a0,y0
add x0,a
asr a
move a1,x:temp
clr a
rts
continue_diver:
asl a ;
bfclr #$0001,sr ;
rep #16 ;
div x0,a ;
move a0,y0 ;
add x0,a
asr a
move a1,x:temp
clr a ;
rts
overflow_deal:
move a0,y0
move a1,a0
move #$0000,a1
asl a
bfclr #$0001,sr
rep #16
div x0,a
lea (sp)+
move a0,x:(sp)
add x0,a
asr a
move a1,a0
move #$0000,a1
jsr right_diver
pop a0
rts
华清远见嵌入式培训第一品牌
http://www.farsight.com.cn/
◆ 中国软件行业协会嵌入式分会会员单位 ◆ 清华大学合作培训机构
◆ “上海嵌入式联盟”唯一指定培训机构 ◆ 《电子产品世界》战略合作伙伴
培训课程有嵌入式Linux就业培训班
嵌入式Linux预科班
嵌入式Linux应用开发班
嵌入式Linux系统开发班
嵌入式Linux驱动开发班
WinCE.Net系统开发基础班
WinCE.Net定制与驱动开发班
FPGA应用设计培训班
C2000DSP系统开发培训班
C5000DSP系统开发培训班
C6000DSP系统开发培训班
C6000 DSP硬件开发培训班
Cadence PCB设计初级班
Cadence PCB设计高级班等
详见http://www.farsight.com.cn/