重写了一遍无指针C编译,做了不少改进和提高。现在可以<br />支持程序的递归及PIC18的扩展指令。优化还可以吧。<br /><br />上传一个例子:<br /><br />#include <p18f25j10.h><br />#include <string.h><br />#include <stdio.h><br /><br />#define OSC_FREQ 3686400L // system frequency<br />#define BAUDRATE 19200*3 // COM port baudrate<br /><br />void rs232_init ();<br />void rs232_sendStrROM (int str_addr);<br />void rs232_sendStrRAM (int str_addr);<br />void delay ();<br />unsigned int fact (unsigned int n);<br /><br />////////////////////////////////////////<br />_reset ()<br />{<br /> goto _main;<br />}<br /><br />////////////////////////////////////////<br />void main ()<br />{<br /> unsigned int n = 1;<br /> unsigned char buf[20];<br /><br /> rs232_init ();<br /><br /> for (;;)<br /> {<br /> ltoa (fact (n), buf, 10);<br /><br /> if ( n < 10 )<br /> putch (' ');<br /> else<br /> putch (n/10 + '0');<br /><br /> putch (n%10 + '0');<br /><br /> rs232_sendStrROM ("! = ");;<br /> rs232_sendStrRAM (buf);<br /> rs232_sendStrROM (": Hello, world! This is a PLCC18 test.\n\r");<br /><br /> if ( ++n > 8 )<br /> n = 1;<br /><br /> delay ();<br /> }<br />}<br /><br />////////////////////////////////////////<br />void delay ()<br />{<br /> unsigned int n = 100000;<br /> while (--n);<br />}<br /><br />////////////////////////////////////////<br />void rs232_init ()<br />{<br /> SPEN = 1;<br /> BRGH = 1;<br /> TRISC &= ~(1 << 6);<br /> TRISC |= (1 << 7);<br /> SPBRG = OSC_FREQ/(BAUDRATE*16) - 1;<br /> TXEN = 1;<br />}<br /><br />////////////////////////////////////////<br />void rs232_sendStrROM (int str_addr)<br />{<br /> char c;<br /> do<br /> {<br /> c = (str_addr++, rom char);<br /><br /> if ( c )<br /> putch (c);<br /><br /> } while ( c );<br />}<br /><br />////////////////////////////////////////<br />void rs232_sendStrRAM (int str_addr)<br />{<br /> char c;<br /><br /> while ( (c = (str_addr++, char)) != '\0' )<br /> putch (c);<br />}<br /><br />////////////////////////////////////////<br />unsigned int fact (unsigned int n)<br />{<br /> if ( n <= 1 )<br /> return 1;<br /><br /> return n * fact (n - 1);<br />}<br /><br />~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />编译后的结果:<br /> 00001 ;**************************************************************** <br /> 00002 ; Microchip PIC18Fxxxx Pointer-less C Compiler (PLCC18), v1.00 <br /> 00003 ; Mon May 21 14:00:07 2007<br /> 00004 ;**************************************************************** <br /> 00005 .device pic18f25j10, X, 1023<br /> 00006 .invoke string<br /> 00007 .invoke stdio<br /> 00008 <br /> 00009 .segment CODE0 (ABS, =0)<br />000000: 00010 __reset:: <br /> 00011 <br /> 00012 ; ::: 'rs232.c' #17: goto _main; <br />000000: rEF00rF000 00013 goto _main<br /> 00014 .segment CODEx (REL, BEG)<br />000000: 00015 _$main$:: <br />000000: 6AE0 00016 clrf BSR<br />000002: rEE20rF000 00017 lfsr 2, _$$ ; init. system stack<br />000006: 6AEA 00018 clrf FSR0H<br />000008: 6AE2 00019 clrf FSR1H<br />00000A: 6AF8 00020 clrf TBLPTRU<br /> 00021 <br /> 00022 .segment CODEx (REL, END)<br />000000: 0012 00023 return<br /> 00024 <br /> 00025 .segment CODE2 (REL)<br /> 00026 _main_1_n .equ 1<br /> 00027 _main_2_buf .equ 3<br /> 00028 _main_$1 .equ 23<br />000000: 00029 _main:: <br />000000: rEC00rF000 00030 call _$main$<br />000004: E997 00031 subfsr 2, 23<br /> 00032 ; ::: 'rs232.c' #23: unsigned int n = 1; <br />000006: 0E01 00033 movlw 1<br />000008: 6E01 00034 movwf _main_1_n<br />00000A: 6A02 00035 clrf _main_1_n+1<br /> 00036 ; ::: 'rs232.c' #26: rs232_init (); <br />00000C: rEC00rF000 00037 call _rs232_init<br />000010: 00038 L3: <br /> 00039 ; ::: 'rs232.c' #30: ltoa (fact (n), buf, 10); <br />000010: E987 00040 subfsr 2, 7<br />000012: EB09 FFDD 00041 movsf _main_1_n+8, POSTDEC2<br />000016: EB09 FFDD 00042 movsf _main_1_n+8, POSTDEC2<br />00001A: rEC00rF000 00043 call _fact<br />00001E: 5100 00044 movf 0, W, 1<br />000020: 6E01 00045 movwf 1<br />000022: 5101 00046 movf 1, W, 1<br />000024: 6E02 00047 movwf 2<br />000026: 6A03 00048 clrf 3<br />000028: 6A04 00049 clrf 4<br />00002A: 0E0A 00050 movlw _main_2_buf+7<br />00002C: 24D9 00051 addwf FSR2L, W<br />00002E: 6E05 00052 movwf 5<br />000030: 0E00 00053 movlw (_main_2_buf+7) >> 8<br />000032: 20DA 00054 addwfc FSR2H, W<br />000034: 6E06 00055 movwf 6<br />000036: 0E0A 00056 movlw 10<br />000038: 6E07 00057 movwf 7<br />00003A: rEC00rF000 00058 call _ltoa<br /> 00059 ; ::: 'rs232.c' #32: if ( n < 10 ) <br />00003E: 0E0A 00060 movlw 10<br />000040: 5C01 00061 subwf _main_1_n, W<br />000042: 0E00 00062 movlw 0<br />000044: 5802 00063 subwfb _main_1_n+1, W<br />000046: B0D8 00064 btfsc STATUS, 0<br />000048: rEF00rF000 00065 goto L7<br /> 00066 ; ::: 'rs232.c' #33: putch (' '); <br />00004C: EA20 00067 pushl 32<br />00004E: rEC00rF000 00068 call _putch<br />000052: rEF00rF000 00069 goto L8<br />000056: 00070 L7: <br /> 00071 ; ::: 'rs232.c' #34: else <br /> 00072 ; ::: putch (n/10 + '0'); <br />000056: E981 00073 subfsr 2, 1<br />000058: EB02 F000 00074 movsf _main_1_n+1, 0<br />00005C: EB03 F001 00075 movsf _main_1_n+2, 1<br />000060: EA0A 00076 pushl 10<br />000062: 6ADD 00077 clrf POSTDEC2<br />000064: rEC00rF000 00078 call __div16<br />000068: 5100 00079 movf 0, W, 1<br />00006A: 6E18 00080 movwf _main_$1+1<br />00006C: 5018 00081 movf _main_$1+1, W<br />00006E: 0F30 00082 addlw 48<br />000070: 6E01 00083 movwf 1<br />000072: rEC00rF000 00084 call _putch<br />000076: 00085 L8: <br /> 00086 ; ::: 'rs232.c' #37: putch (n%10 + '0'); <br />000076: E981 00087 subfsr 2, 1<br />000078: EB02 F000 00088 movsf _main_1_n+1, 0<br />00007C: EB03 F001 00089 movsf _main_1_n+2, 1<br />000080: EA0A 00090 pushl 10<br />000082: 6ADD 00091 clrf POSTDEC2<br />000084: rEC00rF000 00092 call __mod16<br />000088: 5100 00093 movf 0, W, 1<br />00008A: 6E18 00094 movwf _main_$1+1<br />00008C: 5018 00095 movf _main_$1+1, W<br />00008E: 0F30 00096 addlw 48<br />000090: 6E01 00097 movwf 1<br />000092: rEC00rF000 00098 call _putch<br /> 00099 ; ::: 'rs232.c' #39: rs232_sendStrROM ("! = "); <br />000096: rEA00 00100 pushl _CS_1 >> 8<br />000098: rEA00 00101 pushl _CS_1<br />00009A: rEC00rF000 00102 call _rs232_sendStrROM<br /> 00103 ; ::: 'rs232.c' #40: rs232_sendStrRAM (buf); <br />00009E: E982 00104 subfsr 2, 2<br />0000A0: 0E05 00105 movlw _main_2_buf+2<br />0000A2: 24D9 00106 addwf FSR2L, W<br />0000A4: 6E01 00107 movwf 1<br />0000A6: 0E00 00108 movlw (_main_2_buf+2) >> 8<br />0000A8: 20DA 00109 addwfc FSR2H, W<br />0000AA: 6E02 00110 movwf 2<br />0000AC: rEC00rF000 00111 call _rs232_sendStrRAM<br /> 00112 ; ::: 'rs232.c' #41: rs232_sendStrROM (": Hello, world! This is a PLCC18 test.\n\r"); <br />0000B0: rEA00 00113 pushl _CS_2 >> 8<br />0000B2: rEA00 00114 pushl _CS_2<br />0000B4: rEC00rF000 00115 call _rs232_sendStrROM<br /> 00116 ; ::: 'rs232.c' #43: if ( ++n > 8 ) <br />0000B8: 4A01 00117 infsnz _main_1_n, F<br />0000BA: 2A02 00118 incf _main_1_n+1, F<br />0000BC: 0E08 00119 movlw 8<br />0000BE: 5C01 00120 subwf _main_1_n, W<br />0000C0: 6EDD 00121 movwf POSTDEC2<br />0000C2: 0E00 00122 movlw 0<br />0000C4: 5803 00123 subwfb _main_1_n+2, W<br />0000C6: 10DC 00124 iorwf PREINC2, W<br />0000C8: B4D8 00125 btfsc STATUS, 2<br />0000CA: rEF00rF000 00126 goto L10<br />0000CE: A0D8 00127 btfss STATUS, 0<br />0000D0: rEF00rF000 00128 goto L10<br /> 00129 ; ::: 'rs232.c' #44: n = 1; <br />0000D4: 0E01 00130 movlw 1<br />0000D6: 6E01 00131 movwf _main_1_n<br />0000D8: 6A02 00132 clrf _main_1_n+1<br />0000DA: 00133 L10: <br /> 00134 ; ::: 'rs232.c' #46: (); <br />0000DA: rEC00rF000 00135 call _delay<br />0000DE: rEF00rF000 00136 goto L3<br />0000E2: E897 00137 addfsr 2, 23<br />0000E4: 00FF 00138 reset<br /> 00139 <br /> 00140 .segment CODE2 (REL)<br /> 00141 _delay_1_n .equ 1<br />000000: 00142 _delay:: <br />000000: E982 00143 subfsr 2, 2<br /> 00144 ; ::: 'rs232.c' #53: unsigned int n = 100000; <br />000002: 0EA0 00145 movlw 160<br />000004: 6E01 00146 movwf _delay_1_n<br />000006: 0E86 00147 movlw 134<br />000008: 6E02 00148 movwf _delay_1_n+1<br />00000A: 00149 L15: <br /> 00150 ; ::: 'rs232.c' #54: while (--n) <br />00000A: 0EFF 00151 movlw 255<br />00000C: 2601 00152 addwf _delay_1_n, F<br />00000E: 2202 00153 addwfc _delay_1_n+1, F<br />000010: 5001 00154 movf _delay_1_n, W<br />000012: 1002 00155 iorwf _delay_1_n+1, W<br />000014: A4D8 00156 btfss STATUS, 2<br />000016: rEF00rF000 00157 goto L15<br />00001A: E8C2 00158 addulnk 2<br /> 00159 <br /> 00160 .segment CODE2 (REL)<br />000000: 00161 _rs232_init:: <br /> 00162 ; ::: 'rs232.c' #60: SPEN = 1; <br />000000: 8EAB 00163 bsf 4011, 7<br /> 00164 ; ::: 'rs232.c' #61: BRGH = 1; <br />000002: 84AC 00165 bsf 4012, 2<br /> 00166 ; ::: 'rs232.c' #62: TRISC &= ~(1 << 6); <br />000004: 9C94 00167 bcf 3988, 6<br /> 00168 ; ::: 'rs232.c' #63: TRISC |= (1 << 7); <br />000006: 8E94 00169 bsf 3988, 7<br /> 00170 ; ::: 'rs232.c' #64: SPBRG = OSC_FREQ/(BAUDRATE*16) - 1; <br />000008: 0E03 00171 movlw 3<br />00000A: 6EAF 00172 movwf 4015<br /> 00173 ; ::: 'rs232.c' #65: TXEN = 1; <br />00000C: 8AAC 00174 bsf 4012, 5<br />00000E: 0012 00175 return<br /> 00176 <br /> 00177 .segment CODE2 (REL)<br /> 00178 _rs232_sendStrROM_1_c .equ 1<br /> 00179 _rs232_sendStrROM_0 .equ 2<br />000000: 00180 _rs232_sendStrROM:: <br />000000: E981 00181 subfsr 2, 1<br /> 00182 ; ::: 'rs232.c' #72: do <br />000002: 00183 L18: <br /> 00184 ; ::: 'rs232.c' #74: c = (str_addr++, rom char); <br />000002: EB02 FFF6 00185 movsf _rs232_sendStrROM_0, TBLPTRL<br />000006: EB03 FFF7 00186 movsf _rs232_sendStrROM_0+1, TBLPTRH<br />00000A: 6AF8 00187 clrf TBLPTRU<br />00000C: 4A02 00188 infsnz _rs232_sendStrROM_0, F<br />00000E: 2A03 00189 incf _rs232_sendStrROM_0+1, F<br />000010: 0009 00190 tblrd *+<br />000012: 50F5 00191 movf TABLAT, W<br />000014: 6E01 00192 movwf _rs232_sendStrROM_1_c<br /> 00193 ; ::: 'rs232.c' #76: if ( c ) <br />000016: 5001 00194 movf _rs232_sendStrROM_1_c, W<br />000018: B4D8 00195 btfsc STATUS, 2<br />00001A: rEF00rF000 00196 goto L22<br /> 00197 ; ::: 'rs232.c' #77: putch (c); <br />00001E: EB01 FFDD 00198 movsf _rs232_sendStrROM_1_c, POSTDEC2<br />000022: rEC00rF000 00199 call _putch<br />000026: 00200 L22: <br /> 00201 ; ::: 'rs232.c' #79: while ( c ); <br />000026: 5001 00202 movf _rs232_sendStrROM_1_c, W<br />000028: A4D8 00203 btfss STATUS, 2<br />00002A: rEF00rF000 00204 goto L18<br />00002E: E8C3 00205 addulnk 3<br /> 00206 <br /> 00207 .segment CODE2 (REL)<br /> 00208 _rs232_sendStrRAM_1_c .equ 1<br /> 00209 _rs232_sendStrRAM_0 .equ 2<br />000000: 00210 _rs232_sendStrRAM:: <br />000000: E981 00211 subfsr 2, 1<br />000002: 00212 L25: <br /> 00213 ; ::: 'rs232.c' #87: != '\0' ) <br /> 00214 ; ::: 'rs232.c' #87: while ( (c = (str_addr++, char)) <br />000002: EB02 FFE1 00215 movsf _rs232_sendStrRAM_0, FSR1L<br />000006: EB03 FFE2 00216 movsf _rs232_sendStrRAM_0+1, FSR1H<br />00000A: 4A02 00217 infsnz _rs232_sendStrRAM_0, F<br />00000C: 2A03 00218 incf _rs232_sendStrRAM_0+1, F<br />00000E: 50E6 00219 movf POSTINC1, W<br />000010: 6E01 00220 movwf _rs232_sendStrRAM_1_c<br />000012: 5001 00221 movf _rs232_sendStrRAM_1_c, W<br />000014: B4D8 00222 btfsc STATUS, 2<br />000016: rEF00rF000 00223 goto L26<br /> 00224 ; ::: 'rs232.c' #88: putch (c); <br />00001A: EB01 FFDD 00225 movsf _rs232_sendStrRAM_1_c, POSTDEC2<br />00001E: rEC00rF000 00226 call _putch<br />000022: rEF00rF000 00227 goto L25<br />000026: 00228 L26: <br />000026: E8C3 00229 addulnk 3<br /> 00230 <br /> 00231 .segment CODE2 (REL)<br /> 00232 _fact_0 .equ 1<br />000000: 00233 _fact:: <br /> 00234 ; ::: 'rs232.c' #94: if ( n <= 1 ) <br />000000: 0E01 00235 movlw 1<br />000002: 5C01 00236 subwf _fact_0, W<br />000004: 6EDD 00237 movwf POSTDEC2<br />000006: 0E00 00238 movlw 0<br />000008: 5803 00239 subwfb _fact_0+2, W<br />00000A: 10DC 00240 iorwf PREINC2, W<br />00000C: E003 00241 bz L34<br />00000E: B0D8 00242 btfsc STATUS, 0<br />000010: rEF00rF000 00243 goto L30<br />000014: 00244 L34: <br /> 00245 ; ::: 'rs232.c' #95: return 1; <br />000014: 0E01 00246 movlw 1<br />000016: 6F00 00247 movwf 0, 1<br />000018: 6B01 00248 clrf 1, 1<br />00001A: rEF00rF000 00249 goto L28<br />00001E: 00250 L30: <br /> 00251 ; ::: 'rs232.c' #97: n * fact (n - 1); <br />00001E: E982 00252 subfsr 2, 2<br />000020: EB83 F001 00253 movss _fact_0+2, 1<br />000024: EB84 F002 00254 movss _fact_0+3, 2<br />000028: 0EFF 00255 movlw 255<br />00002A: 2601 00256 addwf 1, F<br />00002C: 2202 00257 addwfc 2, F<br />00002E: rEC00rF000 00258 call _fact<br />000032: C000 FFDD 00259 movff 0, POSTDEC2<br />000036: C001 FFDD 00260 movff 1, POSTDEC2<br />00003A: EB03 F000 00261 movsf _fact_0+2, 0<br />00003E: EB04 F001 00262 movsf _fact_0+3, 1<br />000042: rEC00rF000 00263 call __mul16<br />000046: 00264 L28: <br />000046: E8C2 00265 addulnk 2<br /> 00266 <br /> 00267 <br /> 00268 .segment CODE2 (REL)<br />000000: 00269 _CS_1: <br />000000: 21 20 3D 20 00 00270 .db 0x21, 0x20, 0x3D, 0x20, 0x00<br />000005: 00271 _CS_2: <br />000005: 3A 20 48 65 6C 00272 .db 0x3A, 0x20, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x20<br /> 6C 6F 2C 20 77<br /> 6F 72 6C 64 21<br /> 20<br />000015: 54 68 69 73 20 00273 .db 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x50, 0x4C, 0x43, 0x43, 0x31, 0x38<br /> 69 73 20 61 20<br /> 50 4C 43 43 31<br /> 38<br />000025: 20 74 65 73 74 00274 .db 0x20, 0x74, 0x65, 0x73, 0x74, 0x2E, 0x0A, 0x0D, 0x00<br /> 2E 0A 0D 00<br /> 00275 <br /> 00276 .end<br /> |
|