51单片机汇编语言 编乘法和除法子程序
答案:2 悬赏:0 手机版
解决时间 2021-02-13 07:07
- 提问者网友:暮烟疏雨之际
- 2021-02-13 02:50
不要用(mul) 要用移位的方法 编16位无符号的数相乘和相初的子程序 请问怎么编啊??
最佳答案
- 五星知识达人网友:大漠
- 2021-02-13 03:14
;(r3r2r1r0) = (r7r6) * (r5r4), r4-r7 unchanged
mul_word:mov b,r6
mov a,r4
mul ab
mov r0,a
mov r1,b
mov r2,#0
mov r3,#0
mov a,r7
mov b,r4
mul ab
add a,r1
mov r1,a
mov a,r2
addc a,b
mov r2,a
clr a
addc a,r3
mov r3,a
mov a,r6
mov b,r5
mul ab
add a,r1
mov r1,a
mov a,r2
addc a,b
mov r2,a
clr a
addc a,r3
mov r3,a
mov a,r7
mov b,r5
mul ab
add a,r2
mov r2,a
mov a,r3
addc a,b
mov r3,a
ret
;(r3r2r1r0) = (r3r2r1r0)/(r5r4), (r7r6), r4-r5 unchanged
div_4b: mov r7,#0
mov r6,#0
push count
mov count,#32
clr c
div_4b_loop: mov a,r0 ;(r7r6r3r2r1r0) shift left one bit
rlc a
mov r0,a
mov a,r1
rlc a
mov r1,a
mov a,r2
rlc a
mov r2,a
mov a,r3
rlc a
mov r3,a
mov a,r6
rlc a
mov r6,a
mov a,r7
rlc a
mov r7,a
clr c ;if (r7r6)>=(r5r4),(r7r6)-=(r5r4)
mov a,r6
subb a,r4
mov b,a
mov a,r7
subb a,r5
jc div_4b_1
mov r6,b
mov r7,a
div_4b_1: cpl c
djnz count,div_4b_loop
mov a,r0
rlc a
mov r0,a
mov a,r1
rlc a
mov r1,a
mov a,r2
rlc a
mov r2,a
mov a,r3
rlc a
mov r3,a
pop count
ret
mul_word:mov b,r6
mov a,r4
mul ab
mov r0,a
mov r1,b
mov r2,#0
mov r3,#0
mov a,r7
mov b,r4
mul ab
add a,r1
mov r1,a
mov a,r2
addc a,b
mov r2,a
clr a
addc a,r3
mov r3,a
mov a,r6
mov b,r5
mul ab
add a,r1
mov r1,a
mov a,r2
addc a,b
mov r2,a
clr a
addc a,r3
mov r3,a
mov a,r7
mov b,r5
mul ab
add a,r2
mov r2,a
mov a,r3
addc a,b
mov r3,a
ret
;(r3r2r1r0) = (r3r2r1r0)/(r5r4), (r7r6), r4-r5 unchanged
div_4b: mov r7,#0
mov r6,#0
push count
mov count,#32
clr c
div_4b_loop: mov a,r0 ;(r7r6r3r2r1r0) shift left one bit
rlc a
mov r0,a
mov a,r1
rlc a
mov r1,a
mov a,r2
rlc a
mov r2,a
mov a,r3
rlc a
mov r3,a
mov a,r6
rlc a
mov r6,a
mov a,r7
rlc a
mov r7,a
clr c ;if (r7r6)>=(r5r4),(r7r6)-=(r5r4)
mov a,r6
subb a,r4
mov b,a
mov a,r7
subb a,r5
jc div_4b_1
mov r6,b
mov r7,a
div_4b_1: cpl c
djnz count,div_4b_loop
mov a,r0
rlc a
mov r0,a
mov a,r1
rlc a
mov r1,a
mov a,r2
rlc a
mov r2,a
mov a,r3
rlc a
mov r3,a
pop count
ret
全部回答
- 1楼网友:北方的南先生
- 2021-02-13 03:49
可以采用二字节除法,后8位二进制数可以在高位补零凑齐16位,下面程序供参考。
;function name: div-2 byte
;function: unsigned 2 byte divide
;(37h)(36h)=(37h)(36h)/(3bh)(3ah)
;working area data memory: (39h),(38h)
b equ 0f0h
org 0000h
ljmp start
org 0100h
start: mov r3,#16h
clr c
loop1: mov r1,#36h
mov r2,#04h
loop2: mov a,@r1
rlc a
mov @r1,a
inc r1
djnz r2,loop2
mov r0,#39h
mov r1,#41h
mov r2,#02h
lcall data_compare
jc loop3
mov r0,#39h
mov r1,#40h
lcall data_subtract
loop3: cpl c
djnz r3,loop1
mov r1,#36h
mov r2,#02h
loop4: mov a,@r1
rlc a
mov @r1,a
inc r1
djnz r2,loop4
sjmp $
;************************************************
data_compare: mov a,@r0
mov b,@r1
cjne a,b,loop5
inc r0
inc r1
djnz r2,data_compare
loop5: ret
;*************************************************
data_subtract: mov r2,#02h
clr c
loop6: mov a,@r0
subb a,@r1
mov @r0,a
inc r0
inc r1
djnz r2,loop6
ret
end
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯