打印

PIC18系列的无指针C编译的试验。

[复制链接]
3111|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
su_mj000|  楼主 | 2007-5-22 05:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
重写了一遍无指针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
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

286

帖子

1

粉丝