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

📄 ip.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 4 页
字号:
	ld R17,Z+
	movw R10,R30
	xcall _ntohs
	movw R2,R16
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
L123:
	.dbline 283
	movw R24,R12
	adiw R24,1
	movw R12,R24
L125:
	.dbline 283
; 
; 	for (i = 0; i < (len >> 1); i++) checksum += (u32)ntohs(*q++);
	movw R2,R14
	lsr R3
	ror R2
	cp R12,R2
	cpc R13,R3
	brlo L122
	.dbline 284
; 	if (len & 1) checksum += (u32)(ntohs(*q) & 0xff00);
	sbrs R14,0
	rjmp L126
	.dbline 284
	movw R30,R10
	ldd R16,z+0
	ldd R17,z+1
	xcall _ntohs
	movw R24,R16
	andi R24,0
	movw R2,R24
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
L126:
	.dbline 286
; 
; 	return checksum;
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	.dbline -2
L117:
	adiw R28,4
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r q 10 ps
	.dbsym l checksum 0 l
	.dbsym r i 12 s
	.dbsym r len 14 s
	.dbsym r p 12 pc
	.dbend
	.dbfunc e IP_ChecksumFinalize _IP_ChecksumFinalize fs
;       checksum -> y+4
	.even
_IP_ChecksumFinalize::
	xcall push_arg4
	xcall push_gset2
	.dbline -1
	.dbline 290
; }
; 
; u16 IP_ChecksumFinalize(u32 checksum)
; {
	.dbline 291
; 	checksum = (checksum & 0x0000ffff) + ((checksum >> 16) & 0x0000ffff);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	movw R2,R4
	clr R4
	clr R5
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	and R6,R20
	and R7,R21
	and R8,R22
	and R9,R23
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+4,R6
	std z+5,R7
	std z+6,R8
	std z+7,R9
	.dbline 292
; 	if (checksum & 0xffff0000) checksum++;
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,255
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L129
	.dbline 292
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
L129:
	.dbline 293
; 	checksum = ~checksum;
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	com R2
	com R3
	com R4
	com R5
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	.dbline 294
; 	return (u16)(checksum & 0x0000ffff);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R16,R2
	.dbline -2
L128:
	xcall pop_gset2
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l checksum 4 l
	.dbend
	.dbfunc e IP_Checksum1 _IP_Checksum1 fs
;       checksum -> y+0
;            len -> R22,R23
;              p -> R20,R21
	.even
_IP_Checksum1::
	xcall push_gset2
	movw R22,R18
	movw R20,R16
	sbiw R28,4
	.dbline -1
	.dbline 298
; }
; 
; u16 IP_Checksum1(char *p, u16 len)
; {
	.dbline 299
; 	u32 checksum = IP_Checksum(p, len);
	movw R18,R22
	movw R16,R20
	xcall _IP_Checksum
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 300
; 	return IP_ChecksumFinalize(checksum);
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _IP_ChecksumFinalize
	.dbline -2
L131:
	adiw R28,4
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l checksum 0 l
	.dbsym r len 22 s
	.dbsym r p 20 pc
	.dbend
	.dbfunc e IP_Checksum2 _IP_Checksum2 fs
;              w -> y+4
;       checksum -> y+0
;            len -> R20,R21
;              p -> R22,R23
	.even
_IP_Checksum2::
	xcall push_gset2
	movw R20,R18
	movw R22,R16
	sbiw R28,6
	.dbline -1
	.dbline 304
; }
; 
; u16 IP_Checksum2(char *p, u16 len)
; {
	.dbline 321
; 	u16		w;
; 	u32		checksum;
; 
; 	// the tcp and udp packet checksums needs a pseudo header bringing into the calculation.
; 	// the header is not sent with the packet though, it's just for checksum calc.
; 
; //	 0                   1                   2                   3
; //	 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
; //	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; //	|                         Source address                        |
; //	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; //	|                      Destination address                      |
; //	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; //	|     zero      |   Protocol    |        UDP/TCP Length         |
; //	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
; 
; 	checksum = IP_Checksum(p, len);												// checksum the packet
	movw R18,R20
	movw R16,R22
	xcall _IP_Checksum
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 323
; 																				//
; 	checksum += IP_Checksum((char*)&IP_Header->SourceIP.ip32, 4);				// now pull in the pseudo header
	ldi R18,4
	ldi R19,0
	lds R16,_IP_Header
	lds R17,_IP_Header+1
	subi R16,244  ; offset = 12
	sbci R17,255
	xcall _IP_Checksum
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 324
; 	checksum += IP_Checksum((char*)&IP_Header->DestIP.ip32, 4);					//
	ldi R18,4
	ldi R19,0
	lds R16,_IP_Header
	lds R17,_IP_Header+1
	subi R16,240  ; offset = 16
	sbci R17,255
	xcall _IP_Checksum
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 325
; 	w = htons(IP_Header->Protocol); checksum += IP_Checksum((char*)&w, 2);		//
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R16,z+9
	clr R17
	xcall _htons
	std y+5,R17
	std y+4,R16
	.dbline 325
	ldi R18,2
	ldi R19,0
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	xcall _IP_Checksum
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 326
; 	w = htons(len); checksum += IP_Checksum((char*)&w, 2);						//
	movw R16,R20
	xcall _htons
	std y+5,R17
	std y+4,R16
	.dbline 326
	ldi R18,2
	ldi R19,0
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	xcall _IP_Checksum
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 328
; 																				//
; 	return IP_ChecksumFinalize(checksum);										// return the final checksum value
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _IP_ChecksumFinalize
	.dbline -2
L132:
	adiw R28,6
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l w 4 s
	.dbsym l checksum 0 l
	.dbsym r len 20 s
	.dbsym r p 22 pc
	.dbend
	.dbfunc e IP_dec _IP_dec fV
;              w -> R10,R11
;           type -> R12
;            len -> R14
	.even
_IP_dec::
	xcall push_gset5
	sbiw R28,4
	.dbline -1
	.dbline 334
; }
; 
; // **************************************************************************
; 
; void IP_dec(void)
; {
	.dbline 343
; 	// IP packet
; 
; 	// RFC 791
; 	// http://www.freesoft.org/CIE/Course/Section3/
; 
; 	u8		type, len;
; 	u16		w;
; 
; 	IP_Header = (T_IP_Header*)(MainBuffer + MainBufferRd_Rx);				// point to the IP header
	ldi R24,<_MainBuffer
	ldi R25,>_MainBuffer
	lds R2,_MainBufferRd_Rx
	lds R3,_MainBufferRd_Rx+1
	add R2,R24
	adc R3,R25
	sts _IP_Header+1,R3
	sts _IP_Header,R2
	.dbline 345
; 																			//
; 	w = MainBufferWr_Rx - MainBufferRd_Rx;									// number of bytes we have
	lds R2,_MainBufferRd_Rx
	lds R3,_MainBufferRd_Rx+1
	lds R10,_MainBufferWr_Rx
	lds R11,_MainBufferWr_Rx+1
	sub R10,R2
	sbc R11,R3
	.dbline 346
; 	if (w < sizeof(T_IP_Header)) return;									// we don't have enough bytes for the ip header - drop the packet
	movw R24,R10
	cpi R24,20
	ldi R30,0
	cpc R25,R30
	brsh L134
	.dbline 346
	xjmp L133
L134:
	.dbline 348
; 																			//
; 	if ((IP_Header->VerLen & 0xf0) != 0x40) return;							// drop the packet as we're only programmed to deal with IP V4
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R24,z+0
	andi R24,240
	cpi R24,64
	breq L136
	.dbline 348
	xjmp L133
L136:
	.dbline 350
; 																			//
; 	w = (IP_Header->VerLen & 0x0f) << 2;									// i = length of header in bytes
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R24,z+0
	clr R25
	andi R24,15
	andi R25,0
	movw R10,R24
	lsl R10
	rol R11
	lsl R10
	rol R11
	.dbline 351
; 	if (w < sizeof(T_IP_Header)) return;									// error
	movw R24,R10
	cpi R24,20
	ldi R30,0
	cpc R25,R30
	brsh L138
	.dbline 351
	xjmp L133
L138:
	.dbline 352
; 	if (MainBufferWr_Rx < (MainBufferRd_Rx + w)) return;					// we still don't have enough bytes for the ip header - drop the packet
	lds R2,_MainBufferRd_Rx
	lds R3,_MainBufferRd_Rx+1
	add R2,R10
	adc R3,R11
	lds R4,_MainBufferWr_Rx
	lds R5,_MainBufferWr_Rx+1
	cp R4,R2
	cpc R5,R3
	brsh L140
	.dbline 352
	xjmp L133
L140:
	.dbline 354
; 																			//
; 	if ((!IP_Header->Checksum) || (IP_Checksum1((char *)IP_Header, w)))		//
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R2,z+10
	ldd R3,z+11
	tst R2
	brne X8
	tst R3
	breq L144
X8:
	movw R18,R10
	lds R16,_IP_Header
	lds R17,_IP_Header+1
	xcall _IP_Checksum1
	cpi R16,0
	cpc R16,R17
	breq L142
X9:
L144:
	.dbline 355
; 	{																		// invalid checksum
	.dbline 357
; 		#ifdef Debug														//
; 			SendDebugRStr(ip_str16);										//
	ldi R16,<_ip_str16
	ldi R17,>_ip_str16
	xcall _SendDebugRStr
	.dbline 359
; 		#endif																//
; 		return;																//
	xjmp L133
L142:
	.dbline 362
; 	}																		//
; 																			//
; 	w = ntohs(IP_Header->TotalLength);										// total packet length
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R16,z+2
	ldd R17,z+3
	xcall _ntohs
	movw R10,R16
	.dbline 363
; 	if (MainBufferWr_Rx < (MainBufferRd_Rx + w)) return;					// we still don't have enough bytes for the ip header - drop the packet
	lds R2,_MainBufferRd_Rx
	lds R3,_MainBufferRd_Rx+1
	add R2,R16
	adc R3,R17
	lds R4,_MainBufferWr_Rx
	lds R5,_MainBufferWr_Rx+1
	cp R4,R2
	cpc R5,R3
	brsh L145
	.dbline 363
	xjmp L133
L145:
	.dbline 364
; 	MainBufferWr_Rx = MainBufferRd_Rx + w;									// just incase they have padded the packet out - this will drop the padding
	lds R2,_MainBufferRd_Rx
	lds R3,_MainBufferRd_Rx+1
	add R2,R10
	adc R3,R11
	sts _MainBufferWr_Rx+1,R3
	sts _MainBufferWr_Rx,R2
	.dbline 366
; 																			//
; 	if (IP_Header->SourceIP.ip32 == PPP.OUR_IP.ip32) return;				// ahmmmmm, we sent this packet - must be in loop-back mode - drop it
	lds R4,_PPP+13+2
	lds R5,_PPP+13+2+1
	lds R2,_PPP+13
	lds R3,_PPP+13+1
	lds R30,_IP_Header
	lds R31,_IP_Header+1
	ldd R6,z+12
	ldd R7,z+13
	ldd R8,z+14
	ldd R9,z+15
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brne L147
	.dbline 366
	xjmp L133
L147:
	.dbline 371
; 
; 	// ********************************
; 
; 	#ifdef Debug
; 		IP_DisplayProtocol(false, MainBufferWr_Rx);
	lds R18,_MainBufferWr_Rx
	lds R19,_MainBufferWr_Rx+1

⌨️ 快捷键说明

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