mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Übersetzung CRC32-ASM-Makro gesucht


Autor: weissnichtweiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich versuche das Igorplug Ethernet Modul zu modifizieren. Dabei 
will ich die Berechnung der CRC32-Prüfsumme, die bisher als Makro im 
Assembler abläuft, nun im Betrieb durchführen. Es geht um dieses 
Segment:

.set  CRC32init=  0xFFFFFFFF  ;
.set  CRC32polyInv=  0xEDB88320  ;CRC32 polynom (0x04C11DB7) in inverted 
bits order
.set  CRC32  =  CRC32init  ;initialisation of CRC32
.set  Message=  MACDestAddr5  ;load message byte
;bit0 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv);shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit1 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit2 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit3 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit4 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit5 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit6 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message

  ;bit7 of message calculation
  .if ((CRC32^(Message))&1)      ;if xor of CRC32[MSB] and Message[LSB] 
is one (note: CRC32 has now inverted bit order)
    .set  CRC32=((CRC32>>1)^CRC32polyInv)  ;shift the CRC and make xor 
with polynom
  .else          ;if not
    .set  CRC32=  (CRC32>>1)    ;only shift the CRC
  .endif
  .set  Message=(Message>>1)    ;go to next bit in Message
;end of one byte CRC processing


Ich habe das so übersetzt:

;.set  CRC32init=  0xFFFFFFFF  ;
;.set  CRC32polyInv=  0xEDB88320  ;CRC32 polynom (0x04C11DB7) in 
inverted bits order
;.set  CRC32  =  CRC32init  ;initialisation of CRC32

;crc32x schiebt ein Byte durch den CRC
;r17 = Byte Message
;r18 = benutzt
;r16 = benutzt
crc32x:
  ldi   r18,8
crc32x2:
  mov    r16,crc324
  eor    r16,r17    ; CRC32^Message
  lsr   crc321    ; CRC32>>1
  ror   crc322
  ror   crc323
  ror   crc324
;  .if ((CRC32^(Message))&1)
  andi  r16,1
  breq   crc32x1
;    .set  CRC32=((CRC32>>1)^CRC32polyInv)
  eor   crc321,poly1
  eor   crc322,poly2
  eor   crc323,poly3
  eor   crc324,poly4
crc32x1:
;  .else
;    .set  CRC32=  (CRC32>>1)
;  .endif
;  .set  Message=(Message>>1)
  lsr   r17
  dec   r18    ;dec bit counter
  brne   crc32x2
  ret

crc32asm:
  ldi   crc321, 0xff
  ldi   crc322, 0xff
  ldi   crc323, 0xff
  ldi   crc324, 0xff
  ldi   poly1,0xED
  ldi   poly2,0xB8
  ldi   poly3,0x83
  ldi   poly4,0x20

  ldi    r17,MACDestAddr5
  rcall   crc32x
...

Es kommt aber nur Käse dabei raus. Ich sehe den Wald vor lauter Bäumen 
nicht. Kann jemand helfen?

Autor: weissnichtweiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann jemand vielleicht nochmal draufgucken?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.