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

📄 ip.s

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 S
字号:
	.module ip.c
	.area text(rom, con, rel)
	.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\ip.c
	.dbfunc e ip_packhandle _ip_packhandle fc
;       handleok -> R20
;        ipcksum -> y+0
;        sou_ip0 -> R14
;        sou_ip1 -> R22
;        sou_ip2 -> R10
;        sou_ip3 -> R12
;      ipheadlen -> y+10
;         offset -> y+8
;       ippackid -> y+6
;       protocol -> R20
;       totallen -> y+4
;        ipbegin -> R4,R5
	.even
_ip_packhandle::
	xcall push_gset5
	movw R4,R16
	sbiw R28,11
	.dbline -1
	.dbline 19
; #include "main.h"
; #include "rtl8019as.h"
; #include "arp.h"
; #include "ip.h"
; #include "icmp.h"
; #include "udp.h"
; 
; extern unsigned int ip_id;
; extern unsigned char tempip_d3;
; extern unsigned char tempip_d2;
; extern unsigned char tempip_d1;
; extern unsigned char tempip_d0;
; unsigned char tempip_d3;
; unsigned char tempip_d2;
; unsigned char tempip_d1;
; unsigned char tempip_d0;
; 
; unsigned char ip_packhandle(unsigned char *ipbegin)
; {
	.dbline 20
;  unsigned char handleok=0;
	clr R20
	.dbline 21
;  unsigned char ipheadlen=0;
	clr R0
	std y+10,R0
	.dbline 22
;  unsigned int totallen=0;
	clr R1
	std y+5,R1
	std y+4,R0
	.dbline 23
;  unsigned int ippackid=0;
	std y+7,R1
	std y+6,R0
	.dbline 24
;  unsigned int offset=0;
	std y+9,R1
	std y+8,R0
	.dbline 25
;  unsigned char protocol=0;
	.dbline 26
;  unsigned char sou_ip3=0;
	clr R12
	.dbline 27
;  unsigned char sou_ip2=0;
	clr R10
	.dbline 28
;  unsigned char sou_ip1=0;
	clr R22
	.dbline 29
;  unsigned char sou_ip0=0; 
	clr R14
	.dbline 30
;  unsigned int ipcksum=0;
	clr R2
	clr R3
	std y+1,R3
	std y+0,R2
	.dbline 32
;  
;  if((*(ipbegin+16)!=myip_3) || //匹配本地IP,不匹配者忽略
	movw R30,R4
	ldd R24,z+16
	cpi R24,192
	brne L6
	movw R30,R4
	ldd R24,z+17
	cpi R24,168
	brne L6
	movw R30,R4
	ldd R2,z+18
	tst R2
	brne L6
	movw R30,R4
	ldd R24,z+19
	cpi R24,99
	breq L2
L6:
	.dbline 37
;       (*(ipbegin+17)!=myip_2) ||
; 	  (*(ipbegin+18)!=myip_1) ||
; 	  (*(ipbegin+19)!=myip_0)
; 	 )
; 	 {
	.dbline 38
; 	  return 0;
	clr R16
	xjmp L1
L2:
	.dbline 41
; 	 }
;  
;  ipheadlen=((*ipbegin)&0x0F); //获取ip头长度
	movw R30,R4
	ldd R24,z+0
	andi R24,15
	std y+10,R24
	.dbline 42
;  ipheadlen<<=2;
	mov R0,R24
	lsl R0
	lsl R0
	std y+10,R0
	.dbline 43
;  totallen=*(ipbegin+2);       //获取总长度
	ldd R2,z+2
	clr R3
	std y+5,R3
	std y+4,R2
	.dbline 44
;  totallen<<=8;
	movw R0,R2
	mov R1,R0
	clr R0
	std y+5,R1
	std y+4,R0
	.dbline 45
;  totallen|=*(ipbegin+3);
	movw R30,R4
	ldd R2,z+3
	clr R3
	or R0,R2
	or R1,R3
	std y+5,R1
	std y+4,R0
	.dbline 47
;  
;  ippackid=*(ipbegin+4);       //获取ip包id
	movw R30,R4
	ldd R2,z+4
	clr R3
	std y+7,R3
	std y+6,R2
	.dbline 48
;  ippackid<<=8;
	movw R0,R2
	mov R1,R0
	clr R0
	std y+7,R1
	std y+6,R0
	.dbline 49
;  ippackid|=*(ipbegin+5);
	movw R30,R4
	ldd R2,z+5
	clr R3
	or R0,R2
	or R1,R3
	std y+7,R1
	std y+6,R0
	.dbline 51
;  
;  offset=*(ipbegin+6);         //获取包偏移量
	movw R30,R4
	ldd R2,z+6
	clr R3
	std y+9,R3
	std y+8,R2
	.dbline 52
;  offset<<=8;
	movw R0,R2
	mov R1,R0
	clr R0
	std y+9,R1
	std y+8,R0
	.dbline 53
;  offset|=*(ipbegin+7);
	movw R30,R4
	ldd R2,z+7
	clr R3
	or R0,R2
	or R1,R3
	std y+9,R1
	std y+8,R0
	.dbline 55
;  
;  protocol=*(ipbegin+9);       //获取协议类型
	movw R30,R4
	ldd R20,z+9
	.dbline 57
;   
;  sou_ip3=*(ipbegin+12);       //获取源IP
	movw R30,R4
	ldd R12,z+12
	.dbline 58
;  sou_ip2=*(ipbegin+13);
	movw R30,R4
	ldd R10,z+13
	.dbline 59
;  sou_ip1=*(ipbegin+14);
	movw R30,R4
	ldd R22,z+14
	.dbline 60
;  sou_ip0=*(ipbegin+15);
	movw R30,R4
	ldd R14,z+15
	.dbline 62
;  
;  tempip_d3=sou_ip3;
	sts _tempip_d3,R12
	.dbline 63
;  tempip_d2=sou_ip2;
	sts _tempip_d2,R10
	.dbline 64
;  tempip_d1=sou_ip1;
	sts _tempip_d1,R22
	.dbline 65
;  tempip_d0=sou_ip0; 
	sts _tempip_d0,R14
	.dbline 67
;  
;  switch(protocol)
	mov R2,R20
	clr R3
	std y+3,R3
	std y+2,R2
	movw R24,R2
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brne X2
	xjmp L8
X2:
	ldi R24,6
	cp R24,R2
	cpc R25,R3
	brlt L18
L17:
	ldd R24,y+2
	ldd R25,y+3
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L10
	xjmp L8
L18:
	ldd R24,y+2
	ldd R25,y+3
	cpi R24,17
	ldi R30,0
	cpc R25,R30
	brne X3
	xjmp L14
X3:
	xjmp L8
X0:
	.dbline 68
;  {
L10:
	.dbline 70
;   case 1:             //ICMP协议
;        if(icmp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
	ldd R2,y+10
	clr R3
	ldd R18,y+4
	ldd R19,y+5
	sub R18,R2
	sbc R19,R3
	mov R16,R2
	clr R17
	add R16,R4
	adc R17,R5
	push R4
	push R5
	xcall _icmp_packhandle
	pop R5
	pop R4
	tst R16
	brne X4
	xjmp L11
X4:
	.dbline 71
; 	   {	   
	.dbline 72
; 	    ip_id++;       //生成IP标识
	lds R24,_ip_id
	lds R25,_ip_id+1
	adiw R24,1
	sts _ip_id+1,R25
	sts _ip_id,R24
	.dbline 73
; 	    *(ipbegin+4)=(ip_id>>8)&0xFF;
	mov R24,R25
	clr R25
	andi R25,0
	movw R30,R4
	std z+4,R24
	.dbline 74
; 	    *(ipbegin+5)=(ip_id&0xFF);
	lds R24,_ip_id
	lds R25,_ip_id+1
	andi R25,0
	movw R30,R4
	std z+5,R24
	.dbline 76
; 	    
; 	    *(ipbegin+10)=0;//求头部校验和
	clr R2
	movw R30,R4
	std z+10,R2
	.dbline 77
; 	    *(ipbegin+11)=0;
	movw R30,R4
	std z+11,R2
	.dbline 78
; 	    ipcksum=tsum((unsigned int *)ipbegin,ipheadlen); //校验和的求法
	ldd R18,y+10
	clr R19
	movw R16,R4
	push R16
	push R17
	xcall _tsum
	pop R5
	pop R4
	std y+1,R17
	std y+0,R16
	.dbline 79
; 	    *(ipbegin+10)=ipcksum&0xFF;
	movw R24,R16
	andi R25,0
	movw R30,R4
	std z+10,R24
	.dbline 80
; 	    *(ipbegin+11)=(ipcksum>>8)&0xFF;
	movw R24,R16
	mov R24,R25
	clr R25
	andi R25,0
	movw R30,R4
	std z+11,R24
	.dbline 82
; 	   
; 	    *(ipbegin+12)=myip_3;//写入本地IP
	ldi R24,192
	movw R30,R4
	std z+12,R24
	.dbline 83
; 	    *(ipbegin+13)=myip_2;
	ldi R24,168
	movw R30,R4
	std z+13,R24
	.dbline 84
; 	    *(ipbegin+14)=myip_1;
	clr R2
	movw R30,R4
	std z+14,R2
	.dbline 85
; 	    *(ipbegin+15)=myip_0;
	ldi R24,99
	movw R30,R4
	std z+15,R24
	.dbline 87
; 	   
; 	    *(ipbegin+16)=sou_ip3;//写入远程IP
	movw R30,R4
	std z+16,R12
	.dbline 88
; 	    *(ipbegin+17)=sou_ip2;
	movw R30,R4
	std z+17,R10
	.dbline 89
; 	    *(ipbegin+18)=sou_ip1;
	movw R30,R4
	std z+18,R22
	.dbline 90
; 	    *(ipbegin+19)=sou_ip0;
	movw R30,R4
	std z+19,R14
	.dbline 91
; 		break;  
	xjmp L8
L11:
	.dbline 93
; 	   }
; 	    protocol=0;
	clr R20
	.dbline 94
;         break;  
	xjmp L8
X1:
	.dbline 96
;   case 6:             //TCP协议
;        break;
L14:
	.dbline 99
; 	   
;   case 17:            //UDP协议
;        if(udp_packhandle(ipbegin+ipheadlen,totallen-ipheadlen))
	ldd R2,y+10
	clr R3
	ldd R18,y+4
	ldd R19,y+5
	sub R18,R2
	sbc R19,R3
	mov R16,R2
	clr R17
	add R16,R4
	adc R17,R5
	xcall _udp_packhandle
	tst R16
	breq L15
	.dbline 100
; 	   {
	.dbline 101
; 	    break;
	xjmp L8
L15:
	.dbline 103
; 	   }
;        protocol=0;
	clr R20
	.dbline 105
; 	   
;   default:break;
L8:
	.dbline 108
;  }
;  
;  return(protocol);
	mov R16,R20
	.dbline -2
L1:
	adiw R28,11
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r handleok 20 c
	.dbsym l ipcksum 0 i
	.dbsym r sou_ip0 14 c
	.dbsym r sou_ip1 22 c
	.dbsym r sou_ip2 10 c
	.dbsym r sou_ip3 12 c
	.dbsym l ipheadlen 10 c
	.dbsym l offset 8 i
	.dbsym l ippackid 6 i
	.dbsym r protocol 20 c
	.dbsym l totallen 4 i
	.dbsym r ipbegin 4 pc
	.dbend
	.dbfunc e ip_buildpack _ip_buildpack fV
;              i -> R10
;            sum -> R10,R11
;        des_ip0 -> y+22
;        des_ip1 -> y+20
;        des_ip2 -> y+18
;        des_ip3 -> y+16
;       protocol -> y+14
;           ipid -> y+12
;       totallen -> R22,R23
;   ipsendbuffer -> R20,R21
	.even
_ip_buildpack::
	xcall push_gset3
	movw R22,R18
	movw R20,R16
	sbiw R28,6
	.dbline -1
	.dbline 120
; } 
; 
; void ip_buildpack(unsigned char *ipsendbuffer,
;                   unsigned int totallen,
;                   unsigned int ipid,
; 				  unsigned char protocol,
; 				  unsigned char des_ip3,
; 				  unsigned char des_ip2,
; 				  unsigned char des_ip1,
; 				  unsigned char des_ip0
; 				 )
; {
	.dbline 121
;  unsigned char i=0;
	clr R10
	.dbline 122
;  unsigned int sum=0;
	clr R11
	.dbline 123
;  ip_id++;       //生成IP标识
	lds R24,_ip_id
	lds R25,_ip_id+1
	adiw R24,1
	sts _ip_id+1,R25
	sts _ip_id,R24
	.dbline 124
;  *ipsendbuffer=0x45;      //版本4,头部长20
	ldi R24,69
	movw R30,R20
	std z+0,R24
	.dbline 125
;  *(ipsendbuffer+1)=0x00;  //服务类型
	clr R2
	std z+1,R2
	.dbline 126
;  *(ipsendbuffer+2)=totallen>>8;
	movw R2,R22
	mov R2,R3
	clr R3
	movw R30,R20
	std z+2,R2
	.dbline 127
;  *(ipsendbuffer+3)=(totallen&0xFF);
	movw R24,R22
	andi R25,0
	movw R30,R20
	std z+3,R24
	.dbline 128
;  *(ipsendbuffer+4)=ipid>>8;
	ldd R2,y+12
	ldd R3,y+13
	mov R2,R3
	clr R3
	movw R30,R20
	std z+4,R2
	.dbline 129
;  *(ipsendbuffer+5)=(ipid&0xFF);
	ldd R24,y+12
	ldd R25,y+13
	andi R25,0
	movw R30,R20
	std z+5,R24
	.dbline 130
;  *(ipsendbuffer+6)=0;
	clr R2
	movw R30,R20
	std z+6,R2
	.dbline 131
;  *(ipsendbuffer+7)=0;
	movw R30,R20
	std z+7,R2
	.dbline 132
;  *(ipsendbuffer+8)=128;
	ldi R24,128
	movw R30,R20
	std z+8,R24
	.dbline 133
;  *(ipsendbuffer+9)=protocol;
	movw R30,R20
	ldd R0,y+14
	std z+9,R0
	.dbline 134
;  *(ipsendbuffer+10)=0;
	movw R30,R20
	std z+10,R2
	.dbline 135
;  *(ipsendbuffer+11)=0;
	movw R30,R20
	std z+11,R2
	.dbline 136
;  *(ipsendbuffer+12)=myip_3;
	ldi R24,192
	movw R30,R20
	std z+12,R24
	.dbline 137
;  *(ipsendbuffer+13)=myip_2;
	ldi R24,168
	movw R30,R20
	std z+13,R24
	.dbline 138
;  *(ipsendbuffer+14)=myip_1;
	movw R30,R20
	std z+14,R2
	.dbline 139
;  *(ipsendbuffer+15)=myip_0;
	ldi R24,99
	movw R30,R20
	std z+15,R24
	.dbline 140
;  *(ipsendbuffer+16)=des_ip3;
	movw R30,R20
	ldd R0,y+16
	std z+16,R0
	.dbline 141
;  *(ipsendbuffer+17)=des_ip2;
	movw R30,R20
	ldd R0,y+18
	std z+17,R0
	.dbline 142
;  *(ipsendbuffer+18)=des_ip1;
	movw R30,R20
	ldd R0,y+20
	std z+18,R0
	.dbline 143
;  *(ipsendbuffer+19)=des_ip0;
	movw R30,R20
	ldd R0,y+22
	std z+19,R0
	.dbline 145
;  
;  sum=tsum((unsigned int *)ipsendbuffer,20); //校验和的求法
	ldi R18,20
	ldi R19,0
	movw R16,R20
	xcall _tsum
	movw R10,R16
	.dbline 146
;  *(ipsendbuffer+10)=(sum&0xFF);
	movw R24,R10
	andi R25,0
	movw R30,R20
	std z+10,R24
	.dbline 147
;  *(ipsendbuffer+11)=(sum>>8)&0xFF;
	movw R24,R10
	mov R24,R25
	clr R25
	andi R25,0
	movw R30,R20
	std z+11,R24
	.dbline 149
;  
;  totallen-=20;
	subi R22,20
	sbci R23,0
	.dbline 151
;  
;  switch(protocol)
	ldd R2,y+14
	clr R3
	std y+5,R3
	std y+4,R2
	movw R24,R2
	cpi R24,17
	ldi R30,0
	cpc R25,R30
	breq L23
	xjmp L21
X5:
	.dbline 152
;  {
L23:
	.dbline 154
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,16
	std y+1,R25
	std y+0,R24
	movw R18,R22
	movw R16,R20
	subi R16,236  ; offset = 20
	sbci R17,255
	xcall _udp_buildpack
	.dbline 155
	movw R24,R22
	sbiw R24,8
	std y+1,R25
	std y+0,R24
	ldi R18,<_udpsendbuffer_ex
	ldi R19,>_udpsendbuffer_ex
	movw R16,R20
	subi R16,236  ; offset = 20
	sbci R17,255
	xcall _udp_builddata
	.dbline 156
	.dbline 158
L21:
	.dbline -2
L19:
	adiw R28,6
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 10 c
	.dbsym r sum 10 i
	.dbsym l des_ip0 22 c
	.dbsym l des_ip1 20 c
	.dbsym l des_ip2 18 c
	.dbsym l des_ip3 16 c
	.dbsym l protocol 14 c
	.dbsym l ipid 12 i
	.dbsym r totallen 22 i
	.dbsym r ipsendbuffer 20 pc
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\ip.c
_tempip_d0::
	.blkb 1
	.dbsym e tempip_d0 _tempip_d0 c
_tempip_d1::
	.blkb 1
	.dbsym e tempip_d1 _tempip_d1 c
_tempip_d2::
	.blkb 1
	.dbsym e tempip_d2 _tempip_d2 c
_tempip_d3::
	.blkb 1
	.dbsym e tempip_d3 _tempip_d3 c

⌨️ 快捷键说明

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