[Assembler,CRC] Wie Fkt. umwandeln in C++

panicAttack

Grünschnabel
habe die folgende Funktion bekommen und soll sie in ein C++ Programm integrieren. Wie ihr seht soll dies ein 2 Byte CRC erstellen nach CCITT-16bit. Da es aber laut meiner Auskunft nicht genau dem CCITT-32 entsprciht kann ich keine fertigen C++ Funktionen dafür heranziehen. Und leider habe ich überhaupt keine Ahnung von Assembler. Ein paar Tips würden mir für den Anfang auch weiterhelfen. Danke schon mal für eure Hilfe!

Code:
function CRC_CCITT(Start : pointer; Length:Integer):word;assembler
asm
  push esi
  mov esi,start
  cld
  mov ecx,Length
  xor edx,edx
@3:
  lodsb
  xor ah,ah
  xchg al,ah
  xor dx,ax
  push ecx
  mov ecx,8
@1:
  shl dx,1
  jnc @2
  xor dx,01021h
@2:
  loop @1
  pop ecx
  loop @3
  xchg ax,dx
  pop esi
end;
 
Zuletzt bearbeitet:
hmm...ich hab jetzt noch was gelesen, dass es in c die möglichkeit gibt des "inline assembler" nur kommt das dann wohl vor allem auf den compiler an. benutze devcpp mit gcc. nur den code will er nicht annehmen. geht das überhaupt und wenn wie is da die syntax?
 
Original geschrieben von panicAttack
habe die folgende Funktion bekommen und soll sie in ein C++ Programm integrieren. Wie ihr seht soll dies ein 2 Byte CRC erstellen nach CCITT-16bit. Da es aber laut meiner Auskunft nicht genau dem CCITT-32 entsprciht kann ich keine fertigen C++ Funktionen dafür heranziehen. Und leider habe ich überhaupt keine Ahnung von Assembler. Ein paar Tips würden mir für den Anfang auch weiterhelfen. Danke schon mal für eure Hilfe!

Code:
function CRC_CCITT(Start : pointer; Length:Integer):word;assembler
asm
  push esi  //in c unnötig - speichert um später wieder herzustellen
  mov esi,start //in c unnötig - lädt die pointer variable in esi
  cld //direction flag löschen
  mov ecx,Length //länge nach ecx
  xor edx,edx //edx =0
@3:
  lodsb  //lade wert von pointer nach al
  xor ah,ah //ah=0
  xchg al,ah //al mit ah vertauschen
  xor dx,ax //dx mit ax ver-xoren
  push ecx //ecx auf stack speichern -> in c 2 Variablen nehmen
  mov ecx,8 //ecx = 8
@1:
  shl dx,1 //dx /=2
  jnc @2 //sprung wenn carryflag nicht gesetzt
  xor dx,01021h //xor dx mit zahl
@2:
  loop @1 //ecx -1, sprung nach 1
  pop ecx //ecx wiederherstellen
  loop @3 //ecx-1, sprung nach 3
  xchg ax,dx //ax mit dx austauschen - vermutlich ist das Ergebnis in ax
  pop esi //esi wiederherstellen
end;
 
Danke, damit komm ich erstmal ein gutes Stück weiter. Kann leider nicht auf andere Funktionen zurückgreifen, weil das Programm welches diese Fkt nutzt (die eben nicht genau CCITT-16 konform ist) erstellt Dateien, die ich verändern und dann wieder an das Programm zurückschicken muss. Nur muss ich nach veränderungen natürlich auch den CRC anpassen, damit die Datei auch angenommen wird.
 
Ich habe leider doch noch einige Probleme dies in C umzusetzen.

Code:
xor dx,ax //dx mit ax ver-xoren
Was steht denn eigentlich zu Beginn in dx und ax?

Also klar ist mir zumindest, dass er Byteweise bis zum Ende die Datei durchgeht.
Aber auch mit den Sprungmarken hab ich noch Probleme. Wo ist da konkret die Abruchbedingung. @1 hat eine, aber was passiert in @3, da läuft er ja immer wieder ein.
 
Ich weiss nicht, ob du die Registerstruktur kennst.

Es gibt general Purpose Register. Diese lassen sich unterschiedlich ansprechen. Beispiel:

EAX - alle 32 bit des Registers
AX - die unteren 16 bit des Registers
AH - die oberen 8 bit der unteren 16 bit des Registers
AL - die unteren 8 bit des Registers.

In der ersten Schleife ist DX 0, wegen xor edx,edx (setzt alle bit auf 0). AX enthält in AH das geladene Byte, in AL nichts. (AX=AH und AL, AH sind die oberen 8 bit, AL die unteren 8 bit)

Das ganze sind 2 ineinandergeschachtelte For-Schleifen. Beide benutzen ecx als Zähler. Die äusere Schleife looped über alle Bytes, die Innere (@1) wird fest 8 mal durchlaufen, dann wird ecx wieder auf die Byte-Zahl restauriert und mit der äusseren Schleife (@3) weitergemacht. @2 ist eine einfache IF-Abfrage.

Ich hoffe das hilft weiter. Im Zweifel ICQ mich an, meine ICQ-Nummer müsste im Profil stehen.
 

Neue Beiträge

Zurück