Hallo, ich hoffe ich bin hier richtig... Ich habe folgendes Problem:
Ich bin BA Student, habe gerade eine Praxisphase (soweit noch nicht
schlimm) und schreibe gerade an einer Funktion, die eine Prüfsumme eine
UART Kommunikation berechnen soll. Da das ganze einiermaßen schnell sein
sollte und C keinen Rotate befehl kennt, mein PIC18F452 aber schon
wollte ich Inline Assembler verwenden:
************************************************************************
***
_asm
RRNCF checksum_help_high,1,1 // checksum_help_high 2 Bit
Rechtsschieben
RRNCF checksum_help_high,1,1
RLNCF checksum_help,1,1 // checksum_help 2 Bit Linksschieben
RLNCF checksum_help,1,1
_endasm
************************************************************************
***
Danach geht der C-Code weiter. Das Programm wird anstandslos kompiliert,
aber die Befehle werden scheinbar nicht ausgeführt, die Variablen sind
vor und nach dem Inline Assembler Code gleich... Könnt Ihr mir
vielleicht helfen? Schon mal danke im vorraus
Du kannst entweder mit einem Debugger (ICD2 oder PICkit2) nachschauen,
was da passiert, oder Du lässt das Ganze im Simulator laufen.
Vielleicht zuerst mal das Assemblerlisting anschauen, insbesondere ob
die Parameter checksum_help_high und checksum_help richtig aufgelöst
werden.
In welcher Bank liegen die Variablen?
>Da das ganze einiermaßen schnell sein>sollte und C keinen Rotate befehl kennt, mein PIC18F452 aber schon>wollte ich Inline Assembler verwenden:
C kann sehr gut rotieren. Dazu gibt es << oder >>.
Versuch es doch mal damit.
holger wrote:
> C kann sehr gut rotieren. Dazu gibt es << oder >>.> Versuch es doch mal damit.
Diese Operatoren rotieren nicht, sie schieben.
Vielleicht spielt das für Manuel keine Rolle, vielleicht aber doch!
holger wrote:
> Ok, schlechtes Beispiel. Er rotiert aber ohne Carry.> Vieleicht ist das sein Problem.
Wenn Du meinst:
Manuel wrote:
> ... die Variablen sind vor und nach dem Inline Assembler Code gleich...
>> Ok, schlechtes Beispiel. Er rotiert aber ohne Carry.>> Vieleicht ist das sein Problem.>Wenn Du meinst:
Naja, ich habs nicht so mit Assembler.
>Manuel wrote:>> ... die Variablen sind vor und nach dem Inline Assembler Code gleich...
Aber du hast recht: Das Banking könnte schon ein Problem
sein. Wer weiss was er da ohne Banking rotiert.
Da er ohne Carry rotiert entspricht das doch schieben!?
checksum_help_high=checksum_help_high>>2;
checksum_help=checksum_help<<2;
Da muss er sich um das Banking nicht kümmern.
Das macht der Compiler.
Aber ohne weitere Zusammenhänge zu kennen ist es kaum möglich
weitere (unqualifizierte ;) Aussagen zu machen.
>C kann sehr gut rotieren. Dazu gibt es << oder >>.>Versuch es doch mal damit.
">>" rotiert tatsächlich? in meinem C-Buch ist es als shift beschrieben,
also die Bits werden über den Rand geschoben und sind verloren...
Rotieren ohne Carry wäre natürlcih traumhaft, das will ich ja.... muss
ich gleich mal testen...
>Du kannst entweder mit einem Debugger (ICD2 oder PICkit2) nachschauen,>was da passiert, oder Du lässt das Ganze im Simulator laufen.>Vielleicht zuerst mal das Assemblerlisting anschauen, insbesondere ob>die Parameter checksum_help_high und checksum_help richtig aufgelöst>werden.>In welcher Bank liegen die Variablen?
Ok, das hab ich vor lauter Shift und Rotate übersehen Wie bekomm ich
denn die Bank raus un ordne sie richtig zu? Im Disassembly scheit es
nämlich nicht zu stimmen, Da werden, wenn ich das richtig lese, die
Rotates auf andere Adressen ausgeführt, als die, wo die Variablen
liegen:
zB funktioniert:
Checksum_help = ((checksum_help >> 1) ^ checksum;
RRNCF 0xfdf, W, ACCESS // fdf sollte checksum_help sein
und es funktioniert nicht:
RLNCF checksum_help,1,0
RLNCF 0xffe, F, ACCESS