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


von weissnichtweiter (Gast)


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?

von weissnichtweiter (Gast)


Lesenswert?

Kann jemand vielleicht nochmal draufgucken?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.