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