Jaecko
22.06.2007, 18:31
Moin...
Das folgende Programm soll aus einer Zahl, die an Port 0 eingegeben wird, die Wurzel berechnen, die Vorkommastellen in den Speicherbereich 70-72 schreiben, die ersten 5 Nachkommastellen in den Speicherbereich 73-77.
Die Wurzel berechnen klappt soweit. Die Zahl vor dem Komma wird auch korrekt eingetragen. Nur bei den Nachkommastellen hab ich irgendwie ein Problem, welches sich in einem riesigen '?' offenbart.
Im Register 2 werden ja die Vorkommastellen binär gespeichert. im Register R0 'anscheinend' der "Rest". Nur wie krieg ich diesen Rest dann als BCD-Nachkommastellen hin? Irgendwo hab ich nen Denkfehler...
(CPU ist ein normaler 8051, KEIL-Compiler)
ISEG AT 70H
ErgebnisBCD: DS 3
ISEG AT 73H
ErgebnisBCDKomma: DS 5
CSEG AT 0
;NUMH = R0
;NUML = R1
;SQRT = R2
;SUB = R3
;CNTR = R4
;WURZEL BERECHNEN
init: MOV R0,#0
MOV R1,P0
MOV R2,#0
MOV R4,#4
BCK: MOV A,R2
CLR C
RLC A
SETB C
RLC A
MOV R3,A
CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
CLR C
SUBB A,R3
JC Skip
MOV 0,A
SKIP: MOV A,R2
CPL C
RLC A
MOV R2,A
DJNZ R4,BCK
;AB HIER AUFLÖSEN NACH BCD, VORKOMMAANTEIL
BCDStart: MOV R1,#(ErgebnisBCD+2)
MOV R5,#3
MOV A,R2
BCDLoop1: Call BCDDiv10
MOV @R1,B
DEC R1
DJNZ R5,BCDLoop1
JMP BCDStartNext
BCDDiv10: MOV B,#10
DIV AB
RET
BCDStartNext: MOV A,#0
MOV R1,#(ErgebnisBCD+2)
ADD A,@R1
DEC R1
ADD A,@R1
DEC R1
ADD A,@R1
;AB HIER AUFLÖSEN NACH BCD, DEZIMALSTELLEN
[...?...]
JMP INIT
ENDE:
JMP ENDE
END
Das folgende Programm soll aus einer Zahl, die an Port 0 eingegeben wird, die Wurzel berechnen, die Vorkommastellen in den Speicherbereich 70-72 schreiben, die ersten 5 Nachkommastellen in den Speicherbereich 73-77.
Die Wurzel berechnen klappt soweit. Die Zahl vor dem Komma wird auch korrekt eingetragen. Nur bei den Nachkommastellen hab ich irgendwie ein Problem, welches sich in einem riesigen '?' offenbart.
Im Register 2 werden ja die Vorkommastellen binär gespeichert. im Register R0 'anscheinend' der "Rest". Nur wie krieg ich diesen Rest dann als BCD-Nachkommastellen hin? Irgendwo hab ich nen Denkfehler...
(CPU ist ein normaler 8051, KEIL-Compiler)
ISEG AT 70H
ErgebnisBCD: DS 3
ISEG AT 73H
ErgebnisBCDKomma: DS 5
CSEG AT 0
;NUMH = R0
;NUML = R1
;SQRT = R2
;SUB = R3
;CNTR = R4
;WURZEL BERECHNEN
init: MOV R0,#0
MOV R1,P0
MOV R2,#0
MOV R4,#4
BCK: MOV A,R2
CLR C
RLC A
SETB C
RLC A
MOV R3,A
CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
CLR C
SUBB A,R3
JC Skip
MOV 0,A
SKIP: MOV A,R2
CPL C
RLC A
MOV R2,A
DJNZ R4,BCK
;AB HIER AUFLÖSEN NACH BCD, VORKOMMAANTEIL
BCDStart: MOV R1,#(ErgebnisBCD+2)
MOV R5,#3
MOV A,R2
BCDLoop1: Call BCDDiv10
MOV @R1,B
DEC R1
DJNZ R5,BCDLoop1
JMP BCDStartNext
BCDDiv10: MOV B,#10
DIV AB
RET
BCDStartNext: MOV A,#0
MOV R1,#(ErgebnisBCD+2)
ADD A,@R1
DEC R1
ADD A,@R1
DEC R1
ADD A,@R1
;AB HIER AUFLÖSEN NACH BCD, DEZIMALSTELLEN
[...?...]
JMP INIT
ENDE:
JMP ENDE
END