jak udelat _cislo_ MOD 7 ?
Snail Instruments
snail
Středa Březen 17 11:51:44 CET 2004
>nenapada vas nejaky elegantni algoritmus jak udelat _WORD_ MODULO 7, kdyz
>mam k dispozici jen + - a rotace?
Otazka je, v cem tkvi ta elegance - ma to byt kratke, rychle, bezpracne,
univerzalni nebo jake? Ja pouzivam velice sikovnou rutinu na deleni
16bitoveho delence 7bitovym delitelem, mozna by sla adaptovat i na '51, i
kdyz ponekud omezene moznosti rotace vyzaduji neustale presuny promennych
sem-tam a zase zpatky, ale treba se to nekomu podari zefektivnit.
Pokud se deli konstantou, muze se samozrejme nahradit promenna v registru
konkretnim cislem.
; ------------------------------
; UNSIGNED DIVIDE
; AARG1,2 =/ TEMP0
; 179 CYCLES
; ------------------------------
UDIVW: MOVLW D'16'
MOVWF TEMP1
CLRF TEMP2
FXDU0: RLF AARG2,W
RLF AARG1,F
RLF TEMP2,F
MOVF TEMP0,W
SUBWF TEMP2,W
BTFSC _C
MOVWF TEMP2
RLF AARG2,F
DECFSZ TEMP1,F
GOTO FXDU0
MOVF TEMP2,W
; ------------------------------
; UNSIGNED DIVIDE
; R1,2 =/ R3
; 307-323 CYCLES :-(
; ------------------------------
; AARG1,2 - R1,2
; TEMP0 - R3
; TEMP1 - R4
; TEMP2 - R5
; ------------------------------
UDIVA: MOV R4,#16
MOV R5,#0
FXDU0: MOV A,R2
RLC A
MOV A,R1
RLC A
MOV R1,A
MOV A,R5
RLC A
MOV R5,2
MOV A,R5
CLR C
SUBB A,R3
CPL C
JNC FXDU1
MOV R5,A
FXDU1: MOV A,R2
RLC A
MOV R2,A
DJNZ R4,FXDU0
MOV A,R5
J. Hanzal
Další informace o konferenci Hw-list