📄 ip.lis
字号:
.module ip.c
.area text(rom, con, rel)
0000 .dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\ip.c
0000 .dbfunc e ip_packhandle _ip_packhandle fc
0000 ; handleok -> R20
0000 ; ipcksum -> y+0
0000 ; sou_ip0 -> R14
0000 ; sou_ip1 -> R22
0000 ; sou_ip2 -> R10
0000 ; sou_ip3 -> R12
0000 ; ipheadlen -> y+10
0000 ; offset -> y+8
0000 ; ippackid -> y+6
0000 ; protocol -> R20
0000 ; totallen -> y+4
0000 ; ipbegin -> R4,R5
.even
0000 _ip_packhandle::
0000 0E940000 xcall push_gset5
0004 2801 movw R4,R16
0006 2B97 sbiw R28,11
0008 .dbline -1
0008 .dbline 19
0008 ; #include "main.h"
0008 ; #include "rtl8019as.h"
0008 ; #include "arp.h"
0008 ; #include "ip.h"
0008 ; #include "icmp.h"
0008 ; #include "udp.h"
0008 ;
0008 ; extern unsigned int ip_id;
0008 ; extern unsigned char tempip_d3;
0008 ; extern unsigned char tempip_d2;
0008 ; extern unsigned char tempip_d1;
0008 ; extern unsigned char tempip_d0;
0008 ; unsigned char tempip_d3;
0008 ; unsigned char tempip_d2;
0008 ; unsigned char tempip_d1;
0008 ; unsigned char tempip_d0;
0008 ;
0008 ; unsigned char ip_packhandle(unsigned char *ipbegin)
0008 ; {
0008 .dbline 20
0008 ; unsigned char handleok=0;
0008 4427 clr R20
000A .dbline 21
000A ; unsigned char ipheadlen=0;
000A 0024 clr R0
000C 0A86 std y+10,R0
000E .dbline 22
000E ; unsigned int totallen=0;
000E 1124 clr R1
0010 1D82 std y+5,R1
0012 0C82 std y+4,R0
0014 .dbline 23
0014 ; unsigned int ippackid=0;
0014 1F82 std y+7,R1
0016 0E82 std y+6,R0
0018 .dbline 24
0018 ; unsigned int offset=0;
0018 1986 std y+9,R1
001A 0886 std y+8,R0
001C .dbline 25
001C ; unsigned char protocol=0;
001C .dbline 26
001C ; unsigned char sou_ip3=0;
001C CC24 clr R12
001E .dbline 27
001E ; unsigned char sou_ip2=0;
001E AA24 clr R10
0020 .dbline 28
0020 ; unsigned char sou_ip1=0;
0020 6627 clr R22
0022 .dbline 29
0022 ; unsigned char sou_ip0=0;
0022 EE24 clr R14
0024 .dbline 30
0024 ; unsigned int ipcksum=0;
0024 2224 clr R2
0026 3324 clr R3
0028 3982 std y+1,R3
002A 2882 std y+0,R2
002C .dbline 32
002C ;
002C ; if((*(ipbegin+16)!=myip_3) || //匹配本地IP,不匹配者忽略
002C F201 movw R30,R4
002E 8089 ldd R24,z+16
0030 803C cpi R24,192
0032 61F4 brne L6
0034 F201 movw R30,R4
0036 8189 ldd R24,z+17
0038 883A cpi R24,168
003A 41F4 brne L6
003C F201 movw R30,R4
003E 2288 ldd R2,z+18
0040 2220 tst R2
0042 21F4 brne L6
0044 F201 movw R30,R4
0046 8389 ldd R24,z+19
0048 8336 cpi R24,99
004A 11F0 breq L2
004C L6:
004C .dbline 37
004C ; (*(ipbegin+17)!=myip_2) ||
004C ; (*(ipbegin+18)!=myip_1) ||
004C ; (*(ipbegin+19)!=myip_0)
004C ; )
004C ; {
004C .dbline 38
004C ; return 0;
004C 0027 clr R16
004E D3C0 xjmp L1
0050 L2:
0050 .dbline 41
0050 ; }
0050 ;
0050 ; ipheadlen=((*ipbegin)&0x0F); //获取ip头长度
0050 F201 movw R30,R4
0052 8081 ldd R24,z+0
0054 8F70 andi R24,15
0056 8A87 std y+10,R24
0058 .dbline 42
0058 ; ipheadlen<<=2;
0058 082E mov R0,R24
005A 000C lsl R0
005C 000C lsl R0
005E 0A86 std y+10,R0
0060 .dbline 43
0060 ; totallen=*(ipbegin+2); //获取总长度
0060 2280 ldd R2,z+2
0062 3324 clr R3
0064 3D82 std y+5,R3
0066 2C82 std y+4,R2
0068 .dbline 44
0068 ; totallen<<=8;
0068 0101 movw R0,R2
006A 102C mov R1,R0
006C 0024 clr R0
006E 1D82 std y+5,R1
0070 0C82 std y+4,R0
0072 .dbline 45
0072 ; totallen|=*(ipbegin+3);
0072 F201 movw R30,R4
0074 2380 ldd R2,z+3
0076 3324 clr R3
0078 0228 or R0,R2
007A 1328 or R1,R3
007C 1D82 std y+5,R1
007E 0C82 std y+4,R0
0080 .dbline 47
0080 ;
0080 ; ippackid=*(ipbegin+4); //获取ip包id
0080 F201 movw R30,R4
0082 2480 ldd R2,z+4
0084 3324 clr R3
0086 3F82 std y+7,R3
0088 2E82 std y+6,R2
008A .dbline 48
008A ; ippackid<<=8;
008A 0101 movw R0,R2
008C 102C mov R1,R0
008E 0024 clr R0
0090 1F82 std y+7,R1
0092 0E82 std y+6,R0
0094 .dbline 49
0094 ; ippackid|=*(ipbegin+5);
0094 F201 movw R30,R4
0096 2580 ldd R2,z+5
0098 3324 clr R3
009A 0228 or R0,R2
009C 1328 or R1,R3
009E 1F82 std y+7,R1
00A0 0E82 std y+6,R0
00A2 .dbline 51
00A2 ;
00A2 ; offset=*(ipbegin+6); //获取包偏移量
00A2 F201 movw R30,R4
00A4 2680 ldd R2,z+6
00A6 3324 clr R3
00A8 3986 std y+9,R3
00AA 2886 std y+8,R2
00AC .dbline 52
00AC ; offset<<=8;
00AC 0101 movw R0,R2
00AE 102C mov R1,R0
00B0 0024 clr R0
00B2 1986 std y+9,R1
00B4 0886 std y+8,R0
00B6 .dbline 53
00B6 ; offset|=*(ipbegin+7);
00B6 F201 movw R30,R4
00B8 2780 ldd R2,z+7
00BA 3324 clr R3
00BC 0228 or R0,R2
00BE 1328 or R1,R3
00C0 1986 std y+9,R1
00C2 0886 std y+8,R0
00C4 .dbline 55
00C4 ;
00C4 ; protocol=*(ipbegin+9); //获取协议类型
00C4 F201 movw R30,R4
00C6 4185 ldd R20,z+9
00C8 .dbline 57
00C8 ;
00C8 ; sou_ip3=*(ipbegin+12); //获取源IP
00C8 F201 movw R30,R4
00CA C484 ldd R12,z+12
00CC .dbline 58
00CC ; sou_ip2=*(ipbegin+13);
00CC F201 movw R30,R4
00CE A584 ldd R10,z+13
00D0 .dbline 59
00D0 ; sou_ip1=*(ipbegin+14);
00D0 F201 movw R30,R4
00D2 6685 ldd R22,z+14
00D4 .dbline 60
00D4 ; sou_ip0=*(ipbegin+15);
00D4 F201 movw R30,R4
00D6 E784 ldd R14,z+15
00D8 .dbline 62
00D8 ;
00D8 ; tempip_d3=sou_ip3;
00D8 C0920300 sts _tempip_d3,R12
00DC .dbline 63
00DC ; tempip_d2=sou_ip2;
00DC A0920200 sts _tempip_d2,R10
00E0 .dbline 64
00E0 ; tempip_d1=sou_ip1;
00E0 60930100 sts _tempip_d1,R22
00E4 .dbline 65
00E4 ; tempip_d0=sou_ip0;
00E4 E0920000 sts _tempip_d0,R14
00E8 .dbline 67
00E8 ;
00E8 ; switch(protocol)
00E8 242E mov R2,R20
00EA 3324 clr R3
00EC 3B82 std y+3,R3
00EE 2A82 std y+2,R2
00F0 C101 movw R24,R2
00F2 8630 cpi R24,6
00F4 E0E0 ldi R30,0
00F6 9E07 cpc R25,R30
00F8 09F4 brne X2
00FA 7CC0 xjmp L8
00FC X2:
00FC 86E0 ldi R24,6
00FE 8215 cp R24,R2
0100 9305 cpc R25,R3
0102 3CF0 brlt L18
0104 L17:
0104 8A81 ldd R24,y+2
0106 9B81 ldd R25,y+3
0108 8130 cpi R24,1
010A E0E0 ldi R30,0
010C 9E07 cpc R25,R30
010E 49F0 breq L10
0110 71C0 xjmp L8
0112 L18:
0112 8A81 ldd R24,y+2
0114 9B81 ldd R25,y+3
0116 8131 cpi R24,17
0118 E0E0 ldi R30,0
011A 9E07 cpc R25,R30
011C 09F4 brne X3
011E 5AC0 xjmp L14
0120 X3:
0120 69C0 xjmp L8
0122 X0:
0122 .dbline 68
0122 ; {
0122 L10:
0122 .dbline 70
0122 ; case 1: //ICMP协议
0122 ; if(icmp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
0122 2A84 ldd R2,y+10
0124 3324 clr R3
0126 2C81 ldd R18,y+4
0128 3D81 ldd R19,y+5
012A 2219 sub R18,R2
012C 3309 sbc R19,R3
012E 022D mov R16,R2
0130 1127 clr R17
0132 040D add R16,R4
0134 151D adc R17,R5
0136 4F92 push R4
0138 5F92 push R5
013A 0E940000 xcall _icmp_packhandle
013E 5F90 pop R5
0140 4F90 pop R4
0142 0023 tst R16
0144 09F4 brne X4
0146 44C0 xjmp L11
0148 X4:
0148 .dbline 71
0148 ; {
0148 .dbline 72
0148 ; ip_id++; //生成IP标识
0148 80910000 lds R24,_ip_id
014C 90910100 lds R25,_ip_id+1
0150 0196 adiw R24,1
0152 90930100 sts _ip_id+1,R25
0156 80930000 sts _ip_id,R24
015A .dbline 73
015A ; *(ipbegin+4)=(ip_id>>8)&0xFF;
015A 892F mov R24,R25
015C 9927 clr R25
015E 9070 andi R25,0
0160 F201 movw R30,R4
0162 8483 std z+4,R24
0164 .dbline 74
0164 ; *(ipbegin+5)=(ip_id&0xFF);
0164 80910000 lds R24,_ip_id
0168 90910100 lds R25,_ip_id+1
016C 9070 andi R25,0
016E F201 movw R30,R4
0170 8583 std z+5,R24
0172 .dbline 76
0172 ;
0172 ; *(ipbegin+10)=0;//求头部校验和
0172 2224 clr R2
0174 F201 movw R30,R4
0176 2286 std z+10,R2
0178 .dbline 77
0178 ; *(ipbegin+11)=0;
0178 F201 movw R30,R4
017A 2386 std z+11,R2
017C .dbline 78
017C ; ipcksum=tsum((unsigned int *)ipbegin,ipheadlen); //校验和的求法
017C 2A85 ldd R18,y+10
017E 3327 clr R19
0180 8201 movw R16,R4
0182 0F93 push R16
0184 1F93 push R17
0186 0E940000 xcall _tsum
018A 5F90 pop R5
018C 4F90 pop R4
018E 1983 std y+1,R17
0190 0883 std y+0,R16
0192 .dbline 79
0192 ; *(ipbegin+10)=ipcksum&0xFF;
0192 C801 movw R24,R16
0194 9070 andi R25,0
0196 F201 movw R30,R4
0198 8287 std z+10,R24
019A .dbline 80
019A ; *(ipbegin+11)=(ipcksum>>8)&0xFF;
019A C801 movw R24,R16
019C 892F mov R24,R25
019E 9927 clr R25
01A0 9070 andi R25,0
01A2 F201 movw R30,R4
01A4 8387 std z+11,R24
01A6 .dbline 82
01A6 ;
01A6 ; *(ipbegin+12)=myip_3;//写入本地IP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -