Hallo allerseits Ich versuche mich gerade dran, zwei Assembler Routinen in ein C Programm einzubinden. Compilieren & Linken funktionieren prima. Leider tun die Assembler Routinen nicht was ich will. Habt ihr mir einen Tipp, wo ich mich beim Code vertan habe? Danke. :) Das ist mein ASM Sourcecode (Zeilennummern aus dem Editor):
1 | 1 #include <avr/io.h> |
2 | 2 |
3 | 3 .global div10 |
4 | 4 .global mod10 |
5 | 5 |
6 | 6 .section .text |
7 | 7 |
8 | 8 ; div10: divide given number by 10 |
9 | 9 ; using the approximation (n+1)*51 >>9 |
10 | 10 ; call: uint8_t in r25 |
11 | 11 ; return: uint8_t in r24 |
12 | 12 |
13 | 13 div10: |
14 | 14 ldi r24, 51 ; Faktor laden |
15 | 15 inc r25 ; n+1 |
16 | 16 mul r24, r25 ; Produkt in r1:r0 |
17 | 17 movw r24, r0 ; Resultat uebertragen |
18 | 18 lsr r25 ; rechts schieben (division durch 2) |
19 | 19 mov r24, r25 ; weitere 8 shifts (divison durch 256) |
20 | 20 eor r25, r25 ; high byte zur Sicherheit loeschen |
21 | 21 eor r1, r1 ; r1 loeschen (soll immer 0 sein) |
22 | 22 ret |
23 | 23 |
24 | 24 ; mod10: return modulo 10 of given number |
25 | 25 ; using the approximation (n+1)*51 >>9 |
26 | 26 ; call: uint8_t in r25 |
27 | 27 ; return: uint8_t in r24 |
28 | 28 |
29 | 29 mod10: |
30 | 30 ldi r24, 51 ; Faktor laden |
31 | 31 inc r25 ; n+1 |
32 | 32 mul r24, r25 ; Produkt in r1:r0 |
33 | 33 dec r25 ; n wiederherstellen |
34 | 34 lsr r1 ; r1 ist jetzt r1:r0 >> 9 |
35 | 35 sub r25, r1 ; r25 ist jetzt modulo 10 |
36 | 36 mov r24, r25 ; Ergebnis in r24 bereit stellen |
37 | 37 eor r25, r25 ; high byte zur Sicherheit loeschen |
38 | 38 eor r1, r1 ; r1 loeschen |
39 | 39 ret |
40 | 40 |
41 | 41 .end |
Für das C Interface verwende ich dieses Header File mit den Prototypen:
1 | uint8_t div10( uint8_t divisor ); |
2 | uint8_t mod10( uint8_t divisor ); |