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

📄 ip.lis

📁 AVR单片机系统开发经典实例部分源程序
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 057A           ;              p -> R12,R13
                        .even
 057A           _IP_Checksum::
 057A 0E940000          xcall push_gset5
 057E 7901              movw R14,R18
 0580 6801              movw R12,R16
 0582 2497              sbiw R28,4
 0584                   .dbline -1
 0584                   .dbline 273
 0584           ; }
 0584           ; 
 0584           ; // **************************************************************************
 0584           ; // Calculate a checksum - used in IP packets
 0584           ; 
 0584           ; u32 IP_Checksum(char *p, u16 len)
 0584           ; {     // this one REALLY needs to be as fast as possible - best to do this in assembler code
 0584                   .dbline 275
 0584           ;       register u16    i;
 0584           ;       register u32    checksum = 0;
 0584 40E0              ldi R20,0
 0586 50E0              ldi R21,0
 0588 60E0              ldi R22,0
 058A 70E0              ldi R23,0
 058C FE01              movw R30,R28
 058E 4083              std z+0,R20
 0590 5183              std z+1,R21
 0592 6283              std z+2,R22
 0594 7383              std z+3,R23
 0596                   .dbline 278
 0596           ;       register u16    *q;
 0596           ; 
 0596           ;       if (!p) return 0;
 0596 CC20              tst R12
 0598 39F4              brne L118
 059A DD20              tst R13
 059C 29F4              brne L118
 059E           X6:
 059E                   .dbline 278
 059E 00E0              ldi R16,0
 05A0 10E0              ldi R17,0
 05A2 20E0              ldi R18,0
 05A4 30E0              ldi R19,0
 05A6 4CC0              xjmp L117
 05A8           L118:
 05A8                   .dbline 279
 05A8           ;       if (len == 0) return 0;
 05A8 EE20              tst R14
 05AA 39F4              brne L120
 05AC FF20              tst R15
 05AE 29F4              brne L120
 05B0           X7:
 05B0                   .dbline 279
 05B0 00E0              ldi R16,0
 05B2 10E0              ldi R17,0
 05B4 20E0              ldi R18,0
 05B6 30E0              ldi R19,0
 05B8 43C0              xjmp L117
 05BA           L120:
 05BA                   .dbline 281
 05BA           ; 
 05BA           ;       q = (u16*)p;
 05BA 5601              movw R10,R12
 05BC                   .dbline 283
 05BC CC24              clr R12
 05BE DD24              clr R13
 05C0 1AC0              xjmp L125
 05C2           L122:
 05C2                   .dbline 283
 05C2 F501              movw R30,R10
 05C4 0191              ld R16,Z+
 05C6 1191              ld R17,Z+
 05C8 5F01              movw R10,R30
 05CA 0E940000          xcall _ntohs
 05CE 1801              movw R2,R16
 05D0 4424              clr R4
 05D2 5524              clr R5
 05D4 FE01              movw R30,R28
 05D6 6080              ldd R6,z+0
 05D8 7180              ldd R7,z+1
 05DA 8280              ldd R8,z+2
 05DC 9380              ldd R9,z+3
 05DE 620C              add R6,R2
 05E0 731C              adc R7,R3
 05E2 841C              adc R8,R4
 05E4 951C              adc R9,R5
 05E6 FE01              movw R30,R28
 05E8 6082              std z+0,R6
 05EA 7182              std z+1,R7
 05EC 8282              std z+2,R8
 05EE 9382              std z+3,R9
 05F0           L123:
 05F0                   .dbline 283
 05F0 C601              movw R24,R12
 05F2 0196              adiw R24,1
 05F4 6C01              movw R12,R24
 05F6           L125:
 05F6                   .dbline 283
 05F6           ; 
 05F6           ;       for (i = 0; i < (len >> 1); i++) checksum += (u32)ntohs(*q++);
 05F6 1701              movw R2,R14
 05F8 3694              lsr R3
 05FA 2794              ror R2
 05FC C214              cp R12,R2
 05FE D304              cpc R13,R3
 0600 00F3              brlo L122
 0602                   .dbline 284
 0602           ;       if (len & 1) checksum += (u32)(ntohs(*q) & 0xff00);
 0602 E0FE              sbrs R14,0
 0604 18C0              rjmp L126
 0606                   .dbline 284
 0606 F501              movw R30,R10
 0608 0081              ldd R16,z+0
 060A 1181              ldd R17,z+1
 060C 0E940000          xcall _ntohs
 0610 C801              movw R24,R16
 0612 8070              andi R24,0
 0614 1C01              movw R2,R24
 0616 4424              clr R4
 0618 5524              clr R5
 061A FE01              movw R30,R28
 061C 6080              ldd R6,z+0
 061E 7180              ldd R7,z+1
 0620 8280              ldd R8,z+2
 0622 9380              ldd R9,z+3
 0624 620C              add R6,R2
 0626 731C              adc R7,R3
 0628 841C              adc R8,R4
 062A 951C              adc R9,R5
 062C FE01              movw R30,R28
 062E 6082              std z+0,R6
 0630 7182              std z+1,R7
 0632 8282              std z+2,R8
 0634 9382              std z+3,R9
 0636           L126:
 0636                   .dbline 286
 0636           ; 
 0636           ;       return checksum;
 0636 FE01              movw R30,R28
 0638 0081              ldd R16,z+0
 063A 1181              ldd R17,z+1
 063C 2281              ldd R18,z+2
 063E 3381              ldd R19,z+3
 0640                   .dbline -2
 0640           L117:
 0640 2496              adiw R28,4
 0642 0E940000          xcall pop_gset5
 0646                   .dbline 0 ; func end
 0646 0895              ret
 0648                   .dbsym r q 10 ps
 0648                   .dbsym l checksum 0 l
 0648                   .dbsym r i 12 s
 0648                   .dbsym r len 14 s
 0648                   .dbsym r p 12 pc
 0648                   .dbend
 0648                   .dbfunc e IP_ChecksumFinalize _IP_ChecksumFinalize fs
 0648           ;       checksum -> y+4
                        .even
 0648           _IP_ChecksumFinalize::
 0648 0E940000          xcall push_arg4
 064C 0E940000          xcall push_gset2
 0650                   .dbline -1
 0650                   .dbline 290
 0650           ; }
 0650           ; 
 0650           ; u16 IP_ChecksumFinalize(u32 checksum)
 0650           ; {
 0650                   .dbline 291
 0650           ;       checksum = (checksum & 0x0000ffff) + ((checksum >> 16) & 0x0000ffff);
 0650 4FEF              ldi R20,255
 0652 5FEF              ldi R21,255
 0654 60E0              ldi R22,0
 0656 70E0              ldi R23,0
 0658 FE01              movw R30,R28
 065A 2480              ldd R2,z+4
 065C 3580              ldd R3,z+5
 065E 4680              ldd R4,z+6
 0660 5780              ldd R5,z+7
 0662 1201              movw R2,R4
 0664 4424              clr R4
 0666 5524              clr R5
 0668 2422              and R2,R20
 066A 3522              and R3,R21
 066C 4622              and R4,R22
 066E 5722              and R5,R23
 0670 4FEF              ldi R20,255
 0672 5FEF              ldi R21,255
 0674 60E0              ldi R22,0
 0676 70E0              ldi R23,0
 0678 FE01              movw R30,R28
 067A 6480              ldd R6,z+4
 067C 7580              ldd R7,z+5
 067E 8680              ldd R8,z+6
 0680 9780              ldd R9,z+7
 0682 6422              and R6,R20
 0684 7522              and R7,R21
 0686 8622              and R8,R22
 0688 9722              and R9,R23
 068A 620C              add R6,R2
 068C 731C              adc R7,R3
 068E 841C              adc R8,R4
 0690 951C              adc R9,R5
 0692 FE01              movw R30,R28
 0694 6482              std z+4,R6
 0696 7582              std z+5,R7
 0698 8682              std z+6,R8
 069A 9782              std z+7,R9
 069C                   .dbline 292
 069C           ;       if (checksum & 0xffff0000) checksum++;
 069C 40E0              ldi R20,0
 069E 50E0              ldi R21,0
 06A0 6FEF              ldi R22,255
 06A2 7FEF              ldi R23,255
 06A4 FE01              movw R30,R28
 06A6 2480              ldd R2,z+4
 06A8 3580              ldd R3,z+5
 06AA 4680              ldd R4,z+6
 06AC 5780              ldd R5,z+7
 06AE 2422              and R2,R20
 06B0 3522              and R3,R21
 06B2 4622              and R4,R22
 06B4 5722              and R5,R23
 06B6 40E0              ldi R20,0
 06B8 50E0              ldi R21,0
 06BA 60E0              ldi R22,0
 06BC 70E0              ldi R23,0
 06BE 2416              cp R2,R20
 06C0 3506              cpc R3,R21
 06C2 4606              cpc R4,R22
 06C4 5706              cpc R5,R23
 06C6 91F0              breq L129
 06C8                   .dbline 292
 06C8 41E0              ldi R20,1
 06CA 50E0              ldi R21,0
 06CC 60E0              ldi R22,0
 06CE 70E0              ldi R23,0
 06D0 FE01              movw R30,R28
 06D2 2480              ldd R2,z+4
 06D4 3580              ldd R3,z+5
 06D6 4680              ldd R4,z+6
 06D8 5780              ldd R5,z+7
 06DA 240E              add R2,R20
 06DC 351E              adc R3,R21
 06DE 461E              adc R4,R22
 06E0 571E              adc R5,R23
 06E2 FE01              movw R30,R28
 06E4 2482              std z+4,R2
 06E6 3582              std z+5,R3
 06E8 4682              std z+6,R4
 06EA 5782              std z+7,R5
 06EC           L129:
 06EC                   .dbline 293
 06EC           ;       checksum = ~checksum;
 06EC FE01              movw R30,R28
 06EE 2480              ldd R2,z+4
 06F0 3580              ldd R3,z+5
 06F2 4680              ldd R4,z+6
 06F4 5780              ldd R5,z+7
 06F6 2094              com R2
 06F8 3094              com R3
 06FA 4094              com R4
 06FC 5094              com R5
 06FE FE01              movw R30,R28
 0700 2482              std z+4,R2
 0702 3582              std z+5,R3
 0704 4682              std z+6,R4
 0706 5782              std z+7,R5
 0708                   .dbline 294
 0708           ;       return (u16)(checksum & 0x0000ffff);
 0708 4FEF              ldi R20,255
 070A 5FEF              ldi R21,255
 070C 60E0              ldi R22,0
 070E 70E0              ldi R23,0
 0710 FE01              movw R30,R28
 0712 2480              ldd R2,z+4
 0714 3580              ldd R3,z+5
 0716 4680              ldd R4,z+6
 0718 5780              ldd R5,z+7
 071A 2422              and R2,R20
 071C 3522              and R3,R21
 071E 4622              and R4,R22
 0720 5722              and R5,R23
 0722 8101              movw R16,R2
 0724                   .dbline -2
 0724           L128:
 0724 0E940000          xcall pop_gset2
 0728 2496              adiw R28,4
 072A                   .dbline 0 ; func end
 072A 0895              ret
 072C                   .dbsym l checksum 4 l
 072C                   .dbend
 072C                   .dbfunc e IP_Checksum1 _IP_Checksum1 fs
 072C           ;       checksum -> y+0
 072C           ;            len -> R22,R23
 072C           ;              p -> R20,R21
                        .even
 072C           _IP_Checksum1::
 072

⌨️ 快捷键说明

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