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



## panicAttack (16. September 2004)

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!


```
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;
```


----------



## panicAttack (16. September 2004)

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?


----------



## squeaker (16. September 2004)

Wenn's auch ein wenig langsamer als das ASM-Part sein darf. Kleinen Moment noch.

versuch's mal da http://www.programmersheaven.com/zone3/cat846/ - oder mit dem Kommentierten Source von mir.


----------



## squeaker (16. September 2004)

> _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!
> 
> *
> ...


----------



## panicAttack (17. September 2004)

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.


----------



## panicAttack (22. September 2004)

Ich habe leider doch noch einige Probleme dies in C umzusetzen.


```
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.


----------



## squeaker (22. September 2004)

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.


----------

