02-11-2006, 08:55 PM
|
#1
|
Đệ tử 2 túi
Tham gia ngày: Sep 2006
Bài gửi: 33
:
|
Trích:
Nguyên văn bởi falleaf
Code:
#define bf_carry 3, 0
#define bf_zero 3, 2
#define same 1
#define wreg 0
#define stc bsf bf_carry
#define clc bcf bf_carry
;-[ Div ]--------------------------------------------------------------
; Call w/: Number in f_divhi:f_divlo, divisor in W.
; Returns: Quotient in f_divlo, remainder in f_divhi. W preserved.
; Carry set if error. Z if divide by zero, NZ if divide overflow.
; Notes: Works by left shifted subtraction.
; Size = 29, Speed(w/ call&ret) = 7 cycles if div by zero
; Speed = 94 minimum, 129 maximum cycles
Div;
addlw 0 ; w+=0 (to test for div by zero)
stc ; set carry in case of error
btfsc bf_zero ; if zero
return ; return (error C,Z)
call DivSkipHiShift
iDivRepeat = 8
while iDivRepeat
call DivCode
iDivRepeat--
endw
rlf f_divlo, same ; C << lo << C
; If the first subtract didn't underflow, and the carry was shifted
; into the quotient, then it will be shifted back off the end by this
; last RLF. This will automatically raise carry to indicate an error.
; The divide will be accurate to quotients of 9-bits, but past that
; the quotient and remainder will be bogus and carry will be set.
bcf bf_zero ; NZ (in case of overflow error)
return ; we are done!
DivCode
rlf f_divlo, same ; C << lo << C
rlf f_divhi, same ; C << hi << C
btfss bf_carry ; if Carry
goto DivSkipHiShift ;
subwf f_divhi, same ; hi-=w
stc ; ignore carry
return ; done
; endif
DivSkipHiShift
subwf f_divhi, same ; hi-=w
btfsc bf_carry ; if carry set
return ; done
addwf f_divhi, same ; hi+=w
clc ; clear carry
return ; done
Đây là thuật toán chia 16bit cho 8bit. Bạn tìm hiểu và phân tích thêm nhé, có lẽ mafd_47a sẽ giúp bạn phân tích source code này thêm.
Chúc vui.
|
vậy thì khi muốn chia thì làm như thế nào?
Anh có thể chỉ cụ thể hơn dc ko?
|
|
|