⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lfsr.s

📁 AVR单片机控制nokia3510i nokia6100液晶显示屏的库文件及例程
💻 S
字号:
#define Polynom_S  0xC7D5621F
#define Polynom_A  0x5703CF4C

#define rS0  r2          // register S
#define rS1  r3
#define rS2  r4
#define rS3  r5

#define rA0  r6          // register A
#define rA1  r7
#define rA2  r8
#define rA3  r9

#define pS0  r18         // polynom S
#define pS1  r19
#define pS2  r20
#define pS3  r21

#define pA0  r26         // polynom A
#define pA1  r27
#define pA2  r30
#define pA3  r31

#define rR0  r22         // result
#define rR1  r23
#define rR2  r24
#define rR3  r25

#define cnt  r0          // bit counter

     .data
     .extern  lfsr_S
     .extern  lfsr_A
     .text
     .global  lfsr
     .type    lfsr, @function

lfsr:
      push    rS0
      push    rS1
      push    rS2
      push    rS3
      push    rA0
      push    rA1
      push    rA2
      push    rA3

      mov     cnt, r24    // bitcount

      clr     rR0         // result = 0
      clr     rR1
      clr     rR2
      clr     rR3

      ldi     pS3, 0xC7
      ldi     pS2, 0xD5
      ldi     pS1, 0x62
      ldi     pS0, 0x1F
      ldi     pA3, 0x57
      ldi     pA2, 0x03
      ldi     pA1, 0xCF
      ldi     pA0, 0x4C

      lds     rS0, lfsr_S +0
      lds     rS1, lfsr_S +1
      lds     rS2, lfsr_S +2
      lds     rS3, lfsr_S +3
      lds     rA0, lfsr_A +0
      lds     rA1, lfsr_A +1
      lds     rA2, lfsr_A +2
      lds     rA3, lfsr_A +3

_0:   bst     rS0, 0       // t = odd(register s)
      lsr     rS3          // register s = register s >> 1
      ror     rS2
      ror     rS1
      ror     rS0

      lsr     rA3          // register a = register a >> 1
      ror     rA2
      ror     rA1
      ror     rA0
      brcc    _1           // register a was even ??

      eor     rA3, pA3     // register a = register a xor polynom a
      eor     rA2, pA2
      eor     rA1, pA1
      eor     rA0, pA0
      sec

_1:   brtc    _0           // if register s was even

      rol     rR0          // result = result << 1 + odd(register a) before right shift
      rol     rR1
      rol     rR2
      rol     rR3

      eor     rS3, pS3     // register s = register s xor polynom s
      eor     rS2, pS2
      eor     rS1, pS1
      eor     rS0, pS0

      dec     cnt
      brne    _0

      sts     lfsr_S +0, rS0
      sts     lfsr_S +1, rS1
      sts     lfsr_S +2, rS2
      sts     lfsr_S +3, rS3
      sts     lfsr_A +0, rA0
      sts     lfsr_A +1, rA1
      sts     lfsr_A +2, rA2
      sts     lfsr_A +3, rA3

      pop     rA3
      pop     rA2
      pop     rA1
      pop     rA0
      pop     rS3
      pop     rS2
      pop     rS1
      pop     rS0
      ret

#undef Polynom_S
#undef Polynom_A

#undef rS0
#undef rS1
#undef rS2
#undef rS3

#undef rA0
#undef rA1
#undef rA2
#undef rA3

#undef pS0
#undef pS1
#undef pS2
#undef pS3

#undef pA0
#undef pA1
#undef pA2
#undef pA3

#undef rR0
#undef rR1
#undef rR2
#undef rR3

#undef cnt


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -