Hi Leute
Ich kenne mich mit C nicht aus, daher wende ich mich an euch mit der
bitte um Hilfe.
Ich habe da ne Routine in C brauche es in ASM für den Atmel (mega8).
Der Quellcode hat folgenden Inhalt:
char set WL_Psum(char*buffer) reentrant
{
BYTE psum;
psum = 0;
while(*buffer !='\r'){
psum+=*buffer++;
}
*buffer++=nibbleToA((char)((psum/16)&0x0f));
*buffer++=nibbletoA((char)((psum)&0x0f);
*buffer='\r';
return(TRUE)
}
Kann mir das einer so Erklären das ich es in ASM umsetzen kann?
Danke fürs Lesen und Helfen
Du kannst diese Funktion durch einen Compiler schicken und Dir den
Compileroutput ansehen - mit einer der vielen Kommandozeilenoptionen
vom avr-gcc (->Dokumentation) lässt sich die Ausgabe eines
kommentierten Assemblerfiles bewirken.
Wenn Du verstehen möchtest, was diese Routine macht, musst Du
allerdings auch wissen, was nibbleToA macht.
Ich hab' da aber so meine Vermutungen:
Allem Anschein zufolge bildet die Funktion die 8-bit-Prüfsumme aller
Bytes im übergebenen Puffer.
Als Pufferendezeichen wird 0x0A ('\r') ausgewertet und nicht
mitgezählt.
Diese Prüfsumme wird anscheinend in hexadezimaler Schreibweise an den
Puffer angehängt, dabei wird das erste '\r' überschrieben und nach
der Prüfsumme erneut angehängt.
Das ist kein guter Programmierstil. Keine Kommentare, keine Überprüfung
des übergebenenen Puffers oder gar dessen Länge, Verändern der
Pufferlänge ...
Und durch sparsamen Umgang mit Leerzeichen und Klammern schlecht lesbar
und missverständlich.
Besonders Klasse ist das hier
*buffer++=nibblerToA(...);
Um zu verdeutlichen, was gemeint ist, sollten hier "Angstklammern"
verwendet werden (und Leerzeichen, die tun auch nicht weh) :
*(buffer++) = nibbleToA(...);
Ist Dir damit geholfen?
> Ist Dir damit geholfen?
Leider Nein, und Ja es geht um eine Prüfsumme.
Ich habe kein C-Compiler um es in ASM zu übersetzen.
Wie gesagt, kenne mich mit C nicht aus.
Deshalb die Frage wie dieser Spass im ASM zu betrachten ist.
Könntest du es mal durch den Compiler jagen und mir das ASM geben?
Das kann er so nicht ...
dazu bräuchte er auch den restlichen Code ... Alleine deine Funktion
ruft schon wieder eine andere Funktion auf (nibbleToA) ... allein schon
hier wüsste der Compiler nicht mehr was er tun soll und abbrechen ...
Schade, aber das verstehe ich.
Mal ein Beispiel (so ist eine Vorgabe)
0x1b,0x54,0x43,0x34,0x45,0x32,0x30
Prüfsumme ist 0x38 und 0x44, nu rechne ich wie ein Dummer und komme
nicht auf das Ergebniss. Die Zeichen Binär zu Addieren (Word) und das
Ergebniss in Hex Umwandeln ergibt nicht die Prüfsumme.
.
"Die Zeichen Binär zu Addieren (Word) und das
Ergebniss in Hex Umwandeln ergibt nicht die Prüfsumme."
Der Code oben macht auch nur 'ne 8-Bit-Addition, keine
16-Bit-Addition.
Also kommt auch nur 'ne 8-Bit-Prüfsumme dabei raus.
Damit ist die Prüfsumme in Deinem Beispiel mitnichten 0x38 und 0x44,
sondern 0x8D.
Die angegebenen Werte sind nur eine hexadezimale ASCII-Repräsentation
dieser 8-Bit-Zahl; der Algorithmus scheint in erster Linie dazu gedacht
zu sein, lesbare ASCII-Strings mit einer Prüfsumme zu versehen.
Eine (16-bit) Addition aller Werte Deines Beispiels ergibt den Wert
0x18d - da aber nur eine 8-Bit-Addition durchgeführt werden soll,
sollte man sich den 8-Bit-Anteil davon ansehen. Et voilà: 0x8D.
Bedenke, daß obiger Algorithmus auch noch davon ausgeht, daß der zu
prüfende String durch 0x0a terminiert sein muss und das im Puffer nach
diesem terminierenden 0x0a auch noch Platz für zwei weitere Bytes sein
muss!
0x1b,0x54,0x43,0x34,0x45,0x32,0x30,0x0a
wird zu
0x1b,0x54,0x43,0x34,0x45,0x32,0x30,0x38,0x44,0x0a
Wird's klarer?
@Jörg Wunsch
>Was hindert dich daran, dir einen GCC zu installieren?
Das beantwortet:
>AndreasH>...Musste das ein bischen abändern....damit keine Fehlermeldung
kommt.
Nur wer C kann, kann es auch ändern. Die beste Soft nutzt nix, wenn man
sich damit nicht auskennt.
Ihr habt auf alle Fälle eine große Hilfe geleistet.
Danke euch.
btw, was Rufus schon erkannt hat, aber in dem Code völlig fehlt:
nibbleToA; nibble to ASCII; wandelt ein Nibble in seine
ASCII-representation in Ziffern und Buchstaben. Das wird ihm wohl auch
noch komplett fehlen...