📄 ip.lis
字号:
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 + -