1 .file "ip.c" 2 .arch atmega8 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 12 .text 13 .Ltext0: 115 .global Make_IP_Header 117 Make_IP_Header: 118 .stabd 46,0,0 1:ip.c **** /*####################################################################################### 2:ip.c **** AVR Small Webserver 3:ip.c **** 4:ip.c **** Copyright (C) 2004 Ulrich Radig 5:ip.c **** 6:ip.c **** #######################################################################################*/ 7:ip.c **** 8:ip.c **** #include "main.h" 9:ip.c **** #include "ip.h" 10:ip.c **** 11:ip.c **** 12:ip.c **** //############################################################################ 13:ip.c **** //Diese Routine erzeugt ein IP Packet 14:ip.c **** void Make_IP_Header (char *buffer) 15:ip.c **** //############################################################################ 16:ip.c **** { 120 .LM0: 121 /* prologue: frame size=0 */ 122 0000 0F93 push r16 123 0002 1F93 push r17 124 0004 CF93 push r28 125 0006 DF93 push r29 126 /* prologue end (size=4) */ 127 0008 EC01 movw r28,r24 128 000a FC01 movw r30,r24 129 000c A0E0 ldi r26,lo8(mymac) 130 000e B0E0 ldi r27,hi8(mymac) 131 .L2: 132 .LBB2: 17:ip.c **** //Variablen zur Berechnung der Checksumme 18:ip.c **** unsigned int result16; 19:ip.c **** 20:ip.c **** struct Ethernet_Header *ethernet; 21:ip.c **** ethernet = (struct Ethernet_Header *)&buffer[ETHER_OFFSET]; 22:ip.c **** 23:ip.c **** for (unsigned char a = 0; a < 6; a++) 24:ip.c **** { 25:ip.c **** //MAC Destadresse wird geschrieben mit MAC Sourceadresse 26:ip.c **** ethernet->EnetPacketDest[a] = ethernet->EnetPacketSrc[a]; 134 .LM1: 135 0010 8681 ldd r24,Z+6 136 0012 8083 st Z,r24 27:ip.c **** //Meine MAC Adresse wird in Sourceadresse geschrieben 28:ip.c **** ethernet->EnetPacketSrc[a] = mymac[a]; 138 .LM2: 139 0014 8D91 ld r24,X+ 140 0016 8683 std Z+6,r24 141 0018 3196 adiw r30,1 143 .LM3: 144 001a 80E0 ldi r24,hi8(mymac+6) 145 001c A030 cpi r26,lo8(mymac+6) 146 001e B807 cpc r27,r24 147 0020 B9F7 brne .L2 148 .LBE2: 29:ip.c **** } 30:ip.c **** 31:ip.c **** struct IP_Header *ip; 32:ip.c **** ip = (struct IP_Header *)&buffer[IP_OFFSET]; 150 .LM4: 151 0022 8E01 movw r16,r28 152 0024 025F subi r16,lo8(-(14)) 153 0026 1F4F sbci r17,hi8(-(14)) 33:ip.c **** 34:ip.c **** //IP Destadresse wird geschrieben mit IP Sourceadresse 35:ip.c **** //das packet soll ja zurückgeschickt werden :-) 36:ip.c **** ip->IP_Destaddr = ip->IP_Srcaddr; 155 .LM5: 156 0028 F801 movw r30,r16 157 002a 8485 ldd r24,Z+12 158 002c 9585 ldd r25,Z+13 159 002e A685 ldd r26,Z+14 160 0030 B785 ldd r27,Z+15 161 0032 808B std Z+16,r24 162 0034 918B std Z+17,r25 163 0036 A28B std Z+18,r26 164 0038 B38B std Z+19,r27 37:ip.c **** ip->IP_Srcaddr = *((unsigned long *)&MYIP[0]); 166 .LM6: 167 003a 8091 0000 lds r24,MYIP 168 003e 9091 0000 lds r25,(MYIP)+1 169 0042 A091 0000 lds r26,(MYIP)+2 170 0046 B091 0000 lds r27,(MYIP)+3 171 004a 8487 std Z+12,r24 172 004c 9587 std Z+13,r25 173 004e A687 std Z+14,r26 174 0050 B787 std Z+15,r27 38:ip.c **** 39:ip.c **** //Berechnung der IP Checksumme 40:ip.c **** //Alle Daten im IP Header werden addiert checksum wird deshalb 41:ip.c **** //ersteinmal auf null gesetzt 42:ip.c **** ip->IP_Hdr_Cksum = 0x0000; 176 .LM7: 177 0052 1386 std Z+11,__zero_reg__ 178 0054 1286 std Z+10,__zero_reg__ 43:ip.c **** 44:ip.c **** //Berechnung der IP Header länge 45:ip.c **** result16 = (ip->IP_Vers_Len & 0x0F) << 2; 46:ip.c **** 47:ip.c **** //jetzt wird die Checksumme berechnet 48:ip.c **** result16 = checksum (&ip->IP_Vers_Len, result16, 0); 180 .LM8: 181 0056 6E85 ldd r22,Y+14 182 0058 7727 clr r23 183 005a 6F70 andi r22,lo8(15) 184 005c 7070 andi r23,hi8(15) 185 005e 660F lsl r22 186 0060 771F rol r23 187 0062 660F lsl r22 188 0064 771F rol r23 189 0066 20E0 ldi r18,lo8(0) 190 0068 30E0 ldi r19,hi8(0) 191 006a 40E0 ldi r20,hlo8(0) 192 006c 50E0 ldi r21,hhi8(0) 193 006e C801 movw r24,r16 194 0070 00D0 rcall checksum 49:ip.c **** 50:ip.c **** //schreibt Checksumme ins Packet 51:ip.c **** ip->IP_Hdr_Cksum = ((result16 & 0xFF00) >> 8)|((result16 & 0x00FF)<<8); 196 .LM9: 197 0072 292F mov r18,r25 198 0074 3327 clr r19 199 0076 982F mov r25,r24 200 0078 8827 clr r24 201 007a 282B or r18,r24 202 007c 392B or r19,r25 203 007e F801 movw r30,r16 204 0080 3387 std Z+11,r19 205 0082 2287 std Z+10,r18 206 /* epilogue: frame size=0 */ 207 0084 DF91 pop r29 208 0086 CF91 pop r28 209 0088 1F91 pop r17 210 008a 0F91 pop r16 211 008c 0895 ret 212 /* epilogue end (size=5) */ 213 /* function Make_IP_Header size 71 (62) */ 218 .Lscope0: 220 .stabd 78,0,0 222 .Letext0: 223 /* File "ip.c": code 71 = 0x0047 ( 62), prologues 4, epilogues 5 */ DEFINED SYMBOLS *ABS*:00000000 ip.c /tmp/ccZtaNDz.s:3 *ABS*:0000003f __SREG__ /tmp/ccZtaNDz.s:4 *ABS*:0000003e __SP_H__ /tmp/ccZtaNDz.s:5 *ABS*:0000003d __SP_L__ /tmp/ccZtaNDz.s:6 *ABS*:00000000 __tmp_reg__ /tmp/ccZtaNDz.s:7 *ABS*:00000001 __zero_reg__ /tmp/ccZtaNDz.s:117 .text:00000000 Make_IP_Header UNDEFINED SYMBOLS __do_copy_data __do_clear_bss mymac MYIP checksum