############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 14/May/2008 13:01:57 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\Pasha\elf\googlecode\ViewTheLastSMS\pdusms_sie.c # # Command line = D:\Pasha\elf\googlecode\ViewTheLastSMS\pdusms_sie.c # # -D NEWSGOLD -D ELKA -D VKP -lC # # D:\Pasha\elf\googlecode\ViewTheLastSMS\E71Csw41\List # # \ -lA D:\Pasha\elf\googlecode\ViewTheLastSMS\E71Csw4 # # 1\List\ -o D:\Pasha\elf\googlecode\ViewTheLastSMS\E7 # # 1Csw41\Obj\ -s9 --no_unroll --cpu_mode arm --endian # # little --cpu ARM926EJ-S --stack_align 4 --interwork # # -e --fpu None -I "D:\Pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\INC\" --inline_threshold=2 # # List file = D:\Pasha\elf\googlecode\ViewTheLastSMS\E71Csw41\List # # \pdusms_sie.lst # # Object file = D:\Pasha\elf\googlecode\ViewTheLastSMS\E71Csw41\Obj\ # # pdusms_sie.r79 # # # # # ############################################################################## D:\Pasha\elf\googlecode\ViewTheLastSMS\pdusms_sie.c 1 2 #include "..\inc\swilib.h" 3 4 #define TYPE_OUT 0 5 #define TYPE_IN 1 6 #define TYPE_UNK 2 7 #define TYPE_DRAFT 3 8 9 #ifdef VKP 10 #define PROCESSOR_MODE __thumb 11 #else 12 #define PROCESSOR_MODE __arm 13 #endif 14 15 typedef struct 16 { 17 int type; 18 char SMS_CENTER[32]; 19 char Number[32]; 20 char Time[32]; 21 WSHDR *SMS_TEXT; 22 }SMS_DATA; 23 \ In segment CODE, align 4, keep-with-next 24 PROCESSOR_MODE void Hex2Num(char *hex, char *num, int len) 25 { \ Hex2Num: \ 00000000 F0B4 PUSH {R4-R7} 26 int c; 27 int i=0,j; 28 char *p=hex; 29 if(*p==0x91) \ 00000002 0578 LDRB R5,[R0, #+0] \ 00000004 0023 MOVS R3,#+0 \ 00000006 0024 MOVS R4,#+0 \ 00000008 912D CMP R5,#+145 \ 0000000A 02D1 BNE ??Hex2Num_0 30 { 31 num[i]='+'; \ 0000000C 2B24 MOVS R4,#+43 \ 0000000E 0C70 STRB R4,[R1, #+0] 32 i++; \ 00000010 0124 MOVS R4,#+1 33 } 34 p++; \ ??Hex2Num_0: \ 00000012 401C ADDS R0,R0,#+1 35 for (j=0; j=0&&c<=9) 39 num[i]=c+'0'; 40 else 41 break; 42 i++; 43 c=p[j]/0x10; 44 if(c>=0&&c<=9) 45 num[i]=c+'0'; \ ??Hex2Num_2: \ 00000018 3036 ADDS R6,R6,#+48 \ 0000001A 0E55 STRB R6,[R1, R4] 46 else 47 break; 48 i++; \ 0000001C 641C ADDS R4,R4,#+1 \ 0000001E 6D1C ADDS R5,R5,#+1 \ ??Hex2Num_1: \ 00000020 9542 CMP R5,R2 \ 00000022 0EDA BGE ??Hex2Num_3 \ 00000024 465D LDRB R6,[R0, R5] \ 00000026 3709 LSRS R7,R6,#+4 \ 00000028 3F01 LSLS R7,R7,#+4 \ 0000002A F61B SUBS R6,R6,R7 \ 0000002C 09D4 BMI ??Hex2Num_3 \ 0000002E 0A2E CMP R6,#+10 \ 00000030 07DA BGE ??Hex2Num_3 \ 00000032 3036 ADDS R6,R6,#+48 \ 00000034 0E55 STRB R6,[R1, R4] \ 00000036 465D LDRB R6,[R0, R5] \ 00000038 641C ADDS R4,R4,#+1 \ 0000003A 3609 LSRS R6,R6,#+4 \ 0000003C 01D4 BMI ??Hex2Num_3 \ 0000003E 0A2E CMP R6,#+10 \ 00000040 EADB BLT ??Hex2Num_2 49 } 50 num[i]=0; \ ??Hex2Num_3: \ 00000042 0B55 STRB R3,[R1, R4] 51 } \ 00000044 F0BC POP {R4-R7} \ 00000046 7047 BX LR 52 \ In segment CODE, align 4, keep-with-next 53 PROCESSOR_MODE void Add2WS(char *data, char *wsbody, int len) 54 { \ Add2WS: \ 00000000 30B4 PUSH {R4,R5} 55 int i; 56 for(i=0; iSMS_CENTER, c); \ 0000000E 3A00 MOVS R2,R7 \ 00000010 091D ADDS R1,R1,#+4 \ 00000012 3000 MOVS R0,R6 \ 00000014 ........ BL Hex2Num 71 p+=c+2; \ ??SMS_NotOut_0: \ 00000018 F719 ADDS R7,R6,R7 72 c=*p++; \ 0000001A BE78 LDRB R6,[R7, #+2] \ 0000001C FF1C ADDS R7,R7,#+3 73 if(c) \ 0000001E 002E CMP R6,#+0 \ 00000020 0ED0 BEQ ??SMS_NotOut_1 \ 00000022 0020 MOVS R0,#+0 \ 00000024 8019 ADDS R0,R0,R6 \ 00000026 4010 ASRS R0,R0,#+1 \ 00000028 4100 LSLS R1,R0,#+1 \ 0000002A 711A SUBS R1,R6,R1 \ 0000002C 01D0 BEQ ??SMS_NotOut_2 74 { 75 if(c%2) 76 c=c/2+2; \ 0000002E 861C ADDS R6,R0,#+2 \ 00000030 00E0 B ??SMS_NotOut_3 77 else 78 c=c/2+1; \ ??SMS_NotOut_2: \ 00000032 461C ADDS R6,R0,#+1 79 Hex2Num(p, data->Number, c); \ ??SMS_NotOut_3: \ 00000034 3200 MOVS R2,R6 \ 00000036 2900 MOVS R1,R5 \ 00000038 2431 ADDS R1,R1,#+36 \ 0000003A 3800 MOVS R0,R7 \ 0000003C ........ BL Hex2Num 80 } 81 p+=c+oftype; 82 c=*p++; 83 Add2WS(p, (char *)data->SMS_TEXT->wsbody, c); \ ??SMS_NotOut_1: \ 00000040 4435 ADDS R5,R5,#+68 \ 00000042 296A LDR R1,[R5, #+32] \ 00000044 3019 ADDS R0,R6,R4 \ 00000046 0968 LDR R1,[R1, #+0] \ 00000048 3818 ADDS R0,R7,R0 \ 0000004A 0278 LDRB R2,[R0, #+0] \ 0000004C 401C ADDS R0,R0,#+1 \ 0000004E ........ BL Add2WS 84 data->Time[0]=0; \ 00000052 0020 MOVS R0,#+0 \ 00000054 2870 STRB R0,[R5, #+0] 85 } \ 00000056 F0BD POP {R4-R7,PC} ;; return 86 \ In segment CODE, align 4, keep-with-next 87 PROCESSOR_MODE void SMS_In(char *PDU_data, SMS_DATA *data) 88 { \ SMS_In: \ 00000000 70B5 PUSH {R4-R6,LR} 89 char *p=PDU_data; 90 int c=*p++; \ 00000002 0678 LDRB R6,[R0, #+0] \ 00000004 0C00 MOVS R4,R1 \ 00000006 451C ADDS R5,R0,#+1 91 if(c) //len \ 00000008 002E CMP R6,#+0 \ 0000000A 04D0 BEQ ??SMS_In_0 92 Hex2Num(p, data->SMS_CENTER, c); \ 0000000C 3200 MOVS R2,R6 \ 0000000E 091D ADDS R1,R1,#+4 \ 00000010 2800 MOVS R0,R5 \ 00000012 ........ BL Hex2Num 93 p+=c+1; \ ??SMS_In_0: \ 00000016 AE19 ADDS R6,R5,R6 94 c=*p++; \ 00000018 7578 LDRB R5,[R6, #+1] \ 0000001A B61C ADDS R6,R6,#+2 95 if(c) \ 0000001C 002D CMP R5,#+0 \ 0000001E 0ED0 BEQ ??SMS_In_1 \ 00000020 0020 MOVS R0,#+0 \ 00000022 4019 ADDS R0,R0,R5 \ 00000024 4010 ASRS R0,R0,#+1 \ 00000026 4100 LSLS R1,R0,#+1 \ 00000028 691A SUBS R1,R5,R1 \ 0000002A 01D0 BEQ ??SMS_In_2 96 { 97 if(c%2) 98 c=c/2+2; \ 0000002C 851C ADDS R5,R0,#+2 \ 0000002E 00E0 B ??SMS_In_3 99 else 100 c=c/2+1; \ ??SMS_In_2: \ 00000030 451C ADDS R5,R0,#+1 101 Hex2Num(p, data->Number, c); \ ??SMS_In_3: \ 00000032 2A00 MOVS R2,R5 \ 00000034 2100 MOVS R1,R4 \ 00000036 2431 ADDS R1,R1,#+36 \ 00000038 3000 MOVS R0,R6 \ 0000003A ........ BL Hex2Num 102 } 103 p+=c+2; \ ??SMS_In_1: \ 0000003E 7019 ADDS R0,R6,R5 \ 00000040 801C ADDS R0,R0,#+2 104 //time 105 int i; 106 char *pp=data->Time; \ 00000042 2100 MOVS R1,R4 \ 00000044 4431 ADDS R1,R1,#+68 107 for (i=0; i<6; i++) \ 00000046 0022 MOVS R2,#+0 \ 00000048 0023 MOVS R3,#+0 108 { 109 *pp++=p[i]%0x10+'0'; \ ??SMS_In_4: \ 0000004A C55C LDRB R5,[R0, R3] \ 0000004C 2E09 LSRS R6,R5,#+4 \ 0000004E 3601 LSLS R6,R6,#+4 \ 00000050 AD1B SUBS R5,R5,R6 \ 00000052 3035 ADDS R5,R5,#+48 \ 00000054 0D70 STRB R5,[R1, #+0] 110 *pp++=p[i]/0x10+'0'; \ 00000056 C55C LDRB R5,[R0, R3] \ 00000058 2D09 LSRS R5,R5,#+4 \ 0000005A 3035 ADDS R5,R5,#+48 \ 0000005C 4D70 STRB R5,[R1, #+1] \ 0000005E 891C ADDS R1,R1,#+2 111 if(i<2) \ 00000060 022B CMP R3,#+2 \ 00000062 01DA BGE ??SMS_In_5 112 *pp++='-'; \ 00000064 2D25 MOVS R5,#+45 \ 00000066 05E0 B.N ??SMS_In_6 113 if(i==2) \ ??SMS_In_5: \ 00000068 01D1 BNE ??SMS_In_7 114 *pp++=' '; \ 0000006A 2025 MOVS R5,#+32 \ 0000006C 02E0 B.N ??SMS_In_6 115 if(i>2&&i<5) \ ??SMS_In_7: \ 0000006E 052B CMP R3,#+5 \ 00000070 02DA BGE ??SMS_In_8 116 *pp++=':'; \ 00000072 3A25 MOVS R5,#+58 \ ??SMS_In_6: \ 00000074 0D70 STRB R5,[R1, #+0] \ 00000076 491C ADDS R1,R1,#+1 117 } \ ??SMS_In_8: \ 00000078 5B1C ADDS R3,R3,#+1 \ 0000007A 062B CMP R3,#+6 \ 0000007C E5DB BLT ??SMS_In_4 118 *pp=0; \ 0000007E 0A70 STRB R2,[R1, #+0] 119 p+=7; 120 c=*p++; 121 Add2WS(p, (char *)data->SMS_TEXT->wsbody, c); \ 00000080 616E LDR R1,[R4, #+100] \ 00000082 C279 LDRB R2,[R0, #+7] \ 00000084 0968 LDR R1,[R1, #+0] \ 00000086 0830 ADDS R0,R0,#+8 \ 00000088 ........ BL Add2WS 122 } \ 0000008C 70BD POP {R4-R6,PC} ;; return 123 //0 fail, 1, seccess, 2,unk type \ In segment CODE, align 4, keep-with-next 124 PROCESSOR_MODE int PDU_decode(char *PDU_data, SMS_DATA *data) 125 { \ PDU_decode: \ 00000000 00B5 PUSH {LR} \ 00000002 0200 MOVS R2,R0 126 int c; 127 char *p=PDU_data; 128 if ( *p++ != 0x11 ) \ 00000004 1078 LDRB R0,[R2, #+0] \ 00000006 1128 CMP R0,#+17 \ 00000008 01D0 BEQ ??PDU_decode_0 129 return 0; \ ??PDU_decode_1: \ 0000000A 0020 MOVS R0,#+0 \ 0000000C 00BD POP {PC} 130 if ( *p++ != 0x11 ) \ ??PDU_decode_0: \ 0000000E 521C ADDS R2,R2,#+1 \ 00000010 501C ADDS R0,R2,#+1 \ 00000012 1278 LDRB R2,[R2, #+0] \ 00000014 112A CMP R2,#+17 \ 00000016 F8D1 BNE ??PDU_decode_1 131 return 0; 132 c=*p++; \ 00000018 0278 LDRB R2,[R0, #+0] \ 0000001A 401C ADDS R0,R0,#+1 133 switch(c) \ 0000001C 012A CMP R2,#+1 \ 0000001E 0AD0 BEQ ??PDU_decode_2 \ 00000020 032A CMP R2,#+3 \ 00000022 08D0 BEQ ??PDU_decode_2 \ 00000024 052A CMP R2,#+5 \ 00000026 02D0 BEQ ??PDU_decode_3 \ 00000028 072A CMP R2,#+7 \ 0000002A 0AD0 BEQ ??PDU_decode_4 \ 0000002C 0FE0 B ??PDU_decode_5 134 { 135 case 0x5: 136 data->type=TYPE_OUT; \ ??PDU_decode_3: \ 0000002E 0022 MOVS R2,#+0 \ 00000030 0A60 STR R2,[R1, #+0] 137 SMS_NotOut(p, data, 2); \ 00000032 0222 MOVS R2,#+2 \ 00000034 07E0 B.N ??PDU_decode_6 138 return 1; 139 case 0x3: //未查看 140 case 0x1: 141 data->type=TYPE_IN; \ ??PDU_decode_2: \ 00000036 0122 MOVS R2,#+1 \ 00000038 0A60 STR R2,[R1, #+0] 142 SMS_In(p, data); \ 0000003A ........ BL SMS_In 143 return 1; \ 0000003E 0120 MOVS R0,#+1 \ 00000040 00BD POP {PC} 144 case 0x7: 145 data->type=TYPE_DRAFT; \ ??PDU_decode_4: \ 00000042 0322 MOVS R2,#+3 \ 00000044 0A60 STR R2,[R1, #+0] 146 SMS_NotOut(p, data, 3); \ ??PDU_decode_6: \ 00000046 ........ BL SMS_NotOut 147 return 1; \ 0000004A 0120 MOVS R0,#+1 \ 0000004C 00BD POP {PC} 148 } 149 data->type=TYPE_UNK; \ ??PDU_decode_5: \ 0000004E 0220 MOVS R0,#+2 \ 00000050 0860 STR R0,[R1, #+0] 150 return 2; \ 00000052 00BD POP {PC} ;; return 151 } 152 \ In segment CODE, align 4, keep-with-next 153 void GetSMSData(WSHDR *the_ws) 154 { \ GetSMSData: \ 00000000 F0402DE9 PUSH {R4-R7,LR} 155 SMS_DATA data; 156 zeromem(&data, sizeof(SMS_DATA)); 157 WSHDR *xws=AllocWS(256); 158 data.SMS_TEXT=xws; 159 int i=PDU_decode((char *)IncommingPDU(), &data); 160 if(i==0) \ 00000004 3C619FE5 LDR R6,??GetSMSData_0 ;; `?` \ 00000008 4ADF4DE2 SUB SP,SP,#+296 \ 0000000C 0050A0E1 MOV R5,R0 \ 00000010 6810A0E3 MOV R1,#+104 \ 00000014 C0008DE2 ADD R0,SP,#+192 \ 00000018 1D0100EF SWI +285 \ 0000001C 400FA0E3 MOV R0,#+256 \ 00000020 250100EF SWI +293 \ 00000024 0040A0E1 MOV R4,R0 \ 00000028 24418DE5 STR R4,[SP, #+292] \ 0000002C DB8100EF SWI +33243 \ 00000030 C0108DE2 ADD R1,SP,#+192 \ 00000034 ........ BLX PDU_decode \ 00000038 000050E3 CMP R0,#+0 161 { 162 wsprintf(the_ws, "Read PDU error!"); \ 0000003C 08108602 ADDEQ R1,R6,#+8 \ 00000040 3A00000A BEQ ??GetSMSData_1 163 } 164 else if(i==1) \ 00000044 010050E3 CMP R0,#+1 \ 00000048 3700001A BNE ??GetSMSData_2 165 { 166 char out[]="发送到:\n"; \ 0000004C F8109FE5 LDR R1,??GetSMSData_0+0x4 ;; `?` \ 00000050 0D00A0E1 MOV R0,SP \ 00000054 8C0091E8 LDM R1,{R2,R3,R7} 167 char in[]="来自:\n"; 168 char type_out[]="类型: 去短信"; \ 00000058 F0109FE5 LDR R1,??GetSMSData_0+0x8 ;; `?` \ 0000014C ........ DC32 `?` \ 00000150 ........ DC32 `?`: \ 00000000 C0B4D7D43A0A DC8 "\300\264\327\324:\012" \ 00 \ 00000007 00 DC8 0 \ 00000008 526561642050 DC8 "Read PDU error!" \ 445520657272 \ 6F722100 \ 00000018 0ACAB1BCE43A DC8 "\012\312\261\274\344:\012" \ 0A00 \ 00000020 25740A25740A DC8 "%t\012%t\012%t" \ 257400 \ 00000029 000000 DC8 0, 0, 0 \ 0000002C C4DAC8DD3A0A DC8 "\304\332\310\335:\012" \ 00 \ 00000033 00 DC8 0 \ 00000034 556E6B6E6F77 DC8 "Unknow Type!" \ 205479706521 \ 00 \ 00000041 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 B7A2CBCDB5BD DC8 "\267\242\313\315\265\275:\012" \ 3A0A00 \ 00000009 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `? 68 ? 12 ?