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

📄 ip.lis

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -