Nó chỉ ra rằng tôi vẫn còn có một số cũ Mã lắp ráp 68000 cho phép nhân dài và chia dài. 68000 mã là khá sạch sẽ và đơn giản, vì vậy phải dễ dàng dịch cho chip của bạn.
68000 đã nhân và chia hướng dẫn IIRC - Tôi nghĩ rằng chúng được viết dưới dạng bài tập học tập.
Quyết định chỉ cần đặt mã ở đây. Đã thêm nhận xét và, trong quá trình này, đã khắc phục được sự cố.
;
; Purpose : division of longword by longword to give longword
; : all values signed.
; Requires : d0.L == Value to divide
; : d1.L == Value to divide by
; Changes : d0.L == Remainder
; : d2.L == Result
; : corrupts d1, d3, d4
;
section text
ldiv: move #0,d3 ; Convert d0 -ve to +ve - d3 records original sign
tst.l d0
bpl.s lib5a
neg.l d0
not d3
lib5a: tst.l d1 ; Convert d1 -ve to +ve - d3 records result sign
bpl.s lib5b
neg.l d1
not d3
lib5b: tst.l d1 ; Detect division by zero (not really handled well)
bne.s lib3a
rts
lib3a: moveq.l #0,d2 ; Init working result d2
moveq.l #1,d4 ; Init d4
lib3b: cmp.l d0,d1 ; while d0 < d1 {
bhi.s lib3c
asl.l #1,d1 ; double d1 and d4
asl.l #1,d4
bra.s lib3b ; }
lib3c: asr.l #1,d1 ; halve d1 and d4
asr.l #1,d4
bcs.s lib3d ; stop when d4 reaches zero
cmp.l d0,d1 ; do subtraction if appropriate
bhi.s lib3c
or.l d4,d2 ; update result
sub.l d1,d0
bne.s lib3c
lib3d: ; fix the result and remainder signs
; and.l #$7fffffff,d2 ; don't know why this is here
tst d3
beq.s lib3e
neg.l d2
neg.l d0
lib3e: rts
;
; Purpose : Multiply long by long to give long
; Requires : D0.L == Input 1
; : D1.L == Input 2
; Changes : D2.L == Result
; : D3.L is corrupted
;
lmul: move #0,d3 ; d0 -ve to +ve, original sign in d3
tst.l d0
bpl.s lib4c
neg.l d0
not d3
lib4c: tst.l d1 ; d1 -ve to +ve, result sign in d3
bpl.s lib4d
neg.l d1
not d3
lib4d: moveq.l #0,d2 ; init d2 as working result
lib4a: asr.l #1,d0 ; shift d0 right
bcs.s lib4b ; if a bit fell off, update result
asl.l #1,d1 ; either way, shift left d1
tst.l d0
bne.s lib4a ; if d0 non-zero, continue
tst.l d3 ; basically done - apply sign?
beq.s lib4e ; was broken! now fixed
neg.l d2
lib4e: rts
lib4b: add.l d1,d2 ; main loop body - update result
asl.l #1,d1
bra.s lib4a
Nhân tiện - tôi chưa bao giờ tìm ra liệu cần phải chuyển đổi mọi thứ thành tích cực ngay từ đầu. Nếu bạn cẩn thận với thao tác dịch chuyển, đó có thể là chi phí có thể tránh được.
Đây có phải là một số vi điều khiển lạ mà chưa có trình biên dịch C cho nó không? Bạn có thể sử dụng trình biên dịch đó (có lẽ là một ý tưởng hay), hoặc kiểm tra mã nguồn của nó, nếu có, cho các thường trình. –
Bộ vi điều khiển này có tên không? – AakashM
Đây là tính năng mới. Đó là một phần của một dự án nghiên cứu. – srking