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

📄 icmp.lis

📁 AVR单片机系统开发经典实例部分源程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 02C4 8F01              movw R16,R30
 02C6 0E940000          xcall _IP_Checksum1
 02CA 0E940000          xcall _htons
 02CE E0910000          lds R30,_IP_Header
 02D2 F0910100          lds R31,_IP_Header+1
 02D6 1387              std z+11,R17
 02D8 0287              std z+10,R16
 02DA                   .dbline 177
 02DA           ;                                                                                                                                       //
 02DA           ;               MainBufferWr_Tx = MainBufferWr_Rx;                                                      // number of bytes to the packet we are sending back
 02DA 20900000          lds R2,_MainBufferWr_Rx
 02DE 30900100          lds R3,_MainBufferWr_Rx+1
 02E2 30920100          sts _MainBufferWr_Tx+1,R3
 02E6 20920000          sts _MainBufferWr_Tx,R2
 02EA                   .dbline 179
 02EA           ; 
 02EA           ;               len = MainBufferWr_Tx;                                                                          //
 02EA A0900000          lds R10,_MainBufferWr_Tx
 02EE B0900100          lds R11,_MainBufferWr_Tx+1
 02F2                   .dbline 181
 02F2           ; 
 02F2           ;               if (!PPP_SendPacket(false)) return;                                                     // send it
 02F2 0027              clr R16
 02F4 0E940000          xcall _PPP_SendPacket
 02F8 0023              tst R16
 02FA 09F4              brne L38
 02FC                   .dbline 181
 02FC 69C0              xjmp L29
 02FE           L38:
 02FE                   .dbline 184
 02FE           ; 
 02FE           ;               #ifdef Debug
 02FE           ;                       IP_DisplayProtocol(true, len);                                                  //
 02FE 9501              movw R18,R10
 0300 01E0              ldi R16,1
 0302 0E940000          xcall _IP_DisplayProtocol
 0306                   .dbline 185
 0306           ;                       IP_DisplayHeader(4, len);                                                               //
 0306 9501              movw R18,R10
 0308 04E0              ldi R16,4
 030A 10E0              ldi R17,0
 030C 0E940000          xcall _IP_DisplayHeader
 0310                   .dbline 186
 0310           ;                       ICMP_DisplayHeader(4 + sizeof(T_IP_Header), len);               //
 0310 9501              movw R18,R10
 0312 08E1              ldi R16,24
 0314 10E0              ldi R17,0
 0316 74DE              xcall _ICMP_DisplayHeader
 0318                   .dbline 189
 0318           ;               #endif
 0318           ; 
 0318           ;               return;
 0318 5BC0              xjmp L29
 031A           L34:
 031A                   .dbline 194
 031A E0910000          lds R30,_ICMP_Header
 031E F0910100          lds R31,_ICMP_Header+1
 0322 2080              ldd R2,z+0
 0324 2220              tst R2
 0326 09F0              breq X4
 0328 53C0              xjmp L40
 032A           X4:
 032A                   .dbline 195
 032A                   .dbline 197
 032A 00E0              ldi R16,<L42
 032C 10E0              ldi R17,>L42
 032E 0E940000          xcall _SendDebugStr
 0332                   .dbline 200
 0332 20900400          lds R2,_ICMP_SeqNum
 0336 30900500          lds R3,_ICMP_SeqNum+1
 033A 2220              tst R2
 033C 19F4              brne X2
 033E 3320              tst R3
 0340 09F4              brne X5
 0342 46C0              xjmp L29
 0344           X5:
 0344           X2:
 0344 E0910000          lds R30,_ICMP_Header
 0348 F0910100          lds R31,_ICMP_Header+1
 034C 0681              ldd R16,z+6
 034E 1781              ldd R17,z+7
 0350 0E940000          xcall _ntohs
 0354 20900400          lds R2,_ICMP_SeqNum
 0358 30900500          lds R3,_ICMP_SeqNum+1
 035C 0215              cp R16,R2
 035E 1305              cpc R17,R3
 0360 B9F5              brne L29
 0362 40900200          lds R4,_ICMP_IP+2
 0366 50900300          lds R5,_ICMP_IP+2+1
 036A 20900000          lds R2,_ICMP_IP
 036E 30900100          lds R3,_ICMP_IP+1
 0372 E0910000          lds R30,_IP_Header
 0376 F0910100          lds R31,_IP_Header+1
 037A 6484              ldd R6,z+12
 037C 7584              ldd R7,z+13
 037E 8684              ldd R8,z+14
 0380 9784              ldd R9,z+15
 0382 6214              cp R6,R2
 0384 7304              cpc R7,R3
 0386 8404              cpc R8,R4
 0388 9504              cpc R9,R5
 038A 11F5              brne L29
 038C                   .dbline 201
 038C                   .dbline 202
 038C 2224              clr R2
 038E 3324              clr R3
 0390 30920500          sts _ICMP_SeqNum+1,R3
 0394 20920400          sts _ICMP_SeqNum,R2
 0398                   .dbline 203
 0398 40E0              ldi R20,0
 039A 50E0              ldi R21,0
 039C 60E0              ldi R22,0
 039E 70E0              ldi R23,0
 03A0 50930100          sts _ICMP_IP+1,R21
 03A4 40930000          sts _ICMP_IP,R20
 03A8 70930300          sts _ICMP_IP+2+1,R23
 03AC 60930200          sts _ICMP_IP+2,R22
 03B0                   .dbline 205
 03B0 20900600          lds R2,_ICMP_Timer
 03B4 30900700          lds R3,_ICMP_Timer+1
 03B8 3982              std y+1,R3
 03BA 2882              std y+0,R2
 03BC 20E0              ldi R18,<L45
 03BE 30E0              ldi R19,>L45
 03C0 00E0              ldi R16,<_ScratchPad
 03C2 10E0              ldi R17,>_ScratchPad
 03C4 0E940000          xcall _sprintf
 03C8                   .dbline 206
 03C8 00E0              ldi R16,<_ScratchPad
 03CA 10E0              ldi R17,>_ScratchPad
 03CC 0E940000          xcall _SendConsoleStr
 03D0                   .dbline 207
 03D0                   .dbline 209
 03D0           L40:
 03D0                   .dbline -2
 03D0           L29:
 03D0 2696              adiw R28,6
 03D2 0E940000          xcall pop_gset3
 03D6                   .dbline 0 ; func end
 03D6 0895              ret
 03D8                   .dbsym l dw 2 l
 03D8                   .dbsym r len 10 s
 03D8                   .dbend
 03D8                   .dbfunc e ICMP_Out _ICMP_Out fc
 03D8           ;             w2 -> y+2
 03D8           ;            len -> R14,R15
 03D8           ;        RandNum -> R12,R13
 03D8           ;              w -> R10,R11
 03D8           ;             IP -> y+14
                        .even
 03D8           _ICMP_Out::
 03D8 0E940000          xcall push_arg4
 03DC 0E940000          xcall push_gset5
 03E0 2497              sbiw R28,4
 03E2                   .dbline -1
 03E2                   .dbline 219
 03E2           ;       }
 03E2           ; 
 03E2           ;       // **********************
 03E2           ; 
 03E2           ;       if (ICMP_Header->Type == ICMP_ECHO_REPLY)
 03E2           ;       {       // PONG
 03E2           ;               #ifdef Debug
 03E2           ;                       SendDebugStr("\n");
 03E2           ;               #endif
 03E2           ; 
 03E2           ;               if ((ICMP_SeqNum) && (ntohs(ICMP_Header->SeqNum) == ICMP_SeqNum) && (IP_Header->SourceIP.ip32 == ICMP_IP.ip32))
 03E2           ;               {                                                                                                                                       //
 03E2           ;                       ICMP_SeqNum = 0;                                                                                                //
 03E2           ;                       ICMP_IP.ip32 = 0;                                                                                               //
 03E2           ;                                                                                                                                                       //
 03E2           ;                       sprintf((char*)ScratchPad, "   pong: %ums\n", ICMP_Timer);              //
 03E2           ;                       SendConsoleStr((char*)ScratchPad);                                                              //
 03E2           ;               }                                                                                                                                       //
 03E2           ; 
 03E2           ;               return;
 03E2           ;       }
 03E2           ; 
 03E2           ;       // **********************
 03E2           ; }
 03E2           ; 
 03E2           ; // **************************************************************************
 03E2           ; // send a ping out
 03E2           ; 
 03E2           ; bool ICMP_Out(u32 IP)
 03E2           ; {
 03E2                   .dbline 222
 03E2           ;       u16     w, w2, RandNum, len;
 03E2           ; 
 03E2           ;       if (!IP) return false;                                                                                                                  // no IP supplied
 03E2 40E0              ldi R20,0
 03E4 50E0              ldi R21,0
 03E6 60E0              ldi R22,0
 03E8 70E0              ldi R23,0
 03EA FE01              movw R30,R28
 03EC 2684              ldd R2,z+14
 03EE 3784              ldd R3,z+15
 03F0 4088              ldd R4,z+16
 03F2 5188              ldd R5,z+17
 03F4 2416              cp R2,R20
 03F6 3506              cpc R3,R21
 03F8 4606              cpc R4,R22
 03FA 5706              cpc R5,R23
 03FC 11F4              brne L47
 03FE                   .dbline 222
 03FE 0027              clr R16
 0400 E6C0              xjmp L46
 0402           L47:
 0402                   .dbline 223
 0402           ;       if (MainBufferWr_Rx > 0) return false;                                                                                  // buffer is not yet free
 0402 2224              clr R2
 0404 3324              clr R3
 0406 40900000          lds R4,_MainBufferWr_Rx
 040A 50900100          lds R5,_MainBufferWr_Rx+1
 040E 2414              cp R2,R4
 0410 3504              cpc R3,R5
 0412 14F4              brge L49
 0414                   .dbline 223
 0414 0027              clr R16
 0416 DBC0              xjmp L46
 0418           L49:
 0418                   .dbline 224
 0418           ;       if (MainBufferWr_Tx) return false;                                                                                              // buffer is not yet free
 0418 20900000          lds R2,_MainBufferWr_Tx
 041C 30900100          lds R3,_MainBufferWr_Tx+1
 0420 2220              tst R2
 0422 11F4              brne X6
 0424 3320              tst R3
 0426 11F0              breq L51
 0428           X6:
 0428                   .dbline 224
 0428 0027              clr R16
 042A D1C0              xjmp L46
 042C           L51:
 042C                   .dbline 226
 042C CC24              clr R12
 042E DD24              clr R13
 0430 03C0              xjmp L56
 0432           L53:
 0432                   .dbline 226
 0432 0E940000          xcall _rand
 0436 6801              movw R12,R16
 0438           L54:
 0438                   .dbline 226
 0438           L56:
 0438                   .dbline 226
 0438           ; 
 0438           ;       for (RandNum = 0; !RandNum; ) RandNum = (u16)rand();                                                    //
 0438 CC20              tst R12
 043A 11F4              brne X7
 043C DD20              tst R13
 043E C9F3              breq L53
 0440           X7:
 0440                   .dbline 229
 0440           ; 
 0440           ;       // start the packet off (IP header etc)
 0440           ;       IP_StartPacket(IP_PROTO_ICMP, IP);                                                                                              // start the IP packet off
 0440 FE01              movw R30,R28
 0442 2684              ldd R2,z+14
 0444 3784              ldd R3,z+15
 0446 4088              ldd R4,z+16
 0448 5188              ldd R5,z+17
 044A 4882              std y+0,R4
 044C 5982              std y+1,R5
 044E 9101              movw R18,R2
 0450 01E0              ldi R16,1
 0452 0E940000          xcall _IP_StartPacket
 0456                   .dbline 231
 0456           ; 
 0456           ;       len = MainBufferWr_Tx;                                                                                                                  //
 0456 E0900000          lds R14,_MainBufferWr_Tx
 045A F0900100          lds R15,_MainBufferWr_Tx+1
 045E                   .dbline 234
 045E           ; 
 045E           ;       // add the ICMP header
 045E           ;       ICMP_Header = (T_ICMP_Header*)(MainBuffer + MainBufferWr_Tx);                                   // point to the ICMP header
 045E 80E0              ldi R24,<_MainBuffer
 0460 90E0              ldi R25,>_MainBuffer
 0462 1701              movw R2,R14
 0464 280E              add R2,R24
 0466 391E              adc R3,R25
 0468 30920100          sts _ICMP_Header+1,R3
 046C 20920000          sts _ICMP_Header,R2
 0470                   .dbline 235
 0470           ;       memset(ICMP_Header, 0, sizeof(T_ICMP_Header));                                                                  // clear it
 0470 88E0              ldi R24,8
 0472 90E0              ldi R25,0
 0474 9983              std y+1,R25
 0476 8883              std y+0,R24
 0478 2227              clr R18
 047A 3327              clr R19
 047C 8101              movw R16,R2
 047E 0E940000          xcall _memset
 0482                   .dbline 236
 0482           ;       ICMP_Header->Type = ICMP_ECHO_REQUEST;                                                                                  //
 0482 88E0              ldi R24,8

⌨️ 快捷键说明

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