打印

学单片机C++:RAM(位,位域)操作

[复制链接]
2757|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CC2530|  楼主 | 2011-7-9 08:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 CC2530 于 2011-7-9 08:09 编辑
uint8 io;

uint8 x;

void test_io1a(void)
{
UINT_OBJECT<uint8>::Attach(&io).set_bit(0).clr_bit(1).write_field(2,3,7).ToUINT_BIT_OBJECT<5>().set().clr().toggle().ToUNIT_FIELD_OBJECT<6,2>().write(2);
//优化用小写
}

void test_io1b(void)
{
UINT_OBJECT<uint8>::Attach(&io).Set_Bit(0).Clr_Bit(1).Write_Field(2,3,7).ToUINT_BIT_OBJECT<5>().Set().Clr().Toggle().ToUNIT_FIELD_OBJECT<6,2>().Write(2);
//防优化用大写
}

void test_io2a(void)
{
UINT_BIT_OBJECT<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
//优化用小写
}

void test_io2b(void)
{
UINT_BIT_OBJECT<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
//防优化用大写
}

void test_io3a(void)
{
UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
//优化用小写
}

void test_io3b(void)
{
UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
//防优化用大写
}
编译汇编代码
IAR EW8051 7.60:
-----------------------------------------------------------------------------
        RSEG NEAR_CODE:CODE:NOROOT(0)
//    7 void test_io1a(void)
??test_io1a:
//    8 {   
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//    9     UINT_OBJECT<uint8>::Attach(&io).set_bit(0).clr_bit(1).write_field(2,3,7).ToUINT_BIT_OBJECT<5>().set().clr().toggle().ToUNIT_FIELD_OBJECT<6,2>().write(2);   
        MOV     A,#-0x43
        SJMP    ?Subroutine0
//   10    //优化用小写
//   11 }
//   12

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   13 void test_io1b(void)
??test_io1b:
//   14 {   
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//   15     UINT_OBJECT<uint8>::Attach(&io).Set_Bit(0).Clr_Bit(1).Write_Field(2,3,7).ToUINT_BIT_OBJECT<5>().Set().Clr().Toggle().ToUNIT_FIELD_OBJECT<6,2>().Write(2);   
        MOV     DPTR,#io
        MOVX    A,@DPTR
        SETB    0xE0 /* A   */.0
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        CLR     0xE0 /* A   */.1
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        ORL     A,#0x1c
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        SETB    0xE0 /* A   */.5
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        CLR     0xE0 /* A   */.5
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        XRL     A,#0x20
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        ANL     A,#0xbf
        ORL     A,#0x80
        SJMP    ??Subroutine1_0
//   16    //防优化用大写
//   17 }

        RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
        MOV     DPTR,#io
        REQUIRE ??Subroutine1_0
        ; // Fall through to label ??Subroutine1_0

        RSEG NEAR_CODE:CODE:NOROOT(0)
??Subroutine1_0:
        MOVX    @DPTR,A
        POP     DPH
        POP     DPL
        RET
//   18

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   19 void test_io2a(void)
??test_io2a:
//   20 {
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//   21     UINT_BIT_OBJECT<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
        MOV     DPTR,#io
        MOVX    A,@DPTR
        ANL     A,#0xdf
        XRL     A,#0x20
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        MOV     C,0xE0 /* A   */.5
        JNC     ??test_io2a_1
        MOV     A,#0x1
        SJMP    ??test_io2a_2
??test_io2a_1:
        CLR     A
??test_io2a_2:
        MOV     DPTR,#x
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        CPL     A
        MOV     DPTR,#io
        JZ      ??test_io2a_3
        MOVX    A,@DPTR
        SETB    0xE0 /* A   */.5
        SJMP    ??test_io2a_4
??test_io2a_3:
        MOVX    A,@DPTR
        CLR     0xE0 /* A   */.5
??test_io2a_4:
        SJMP    ??Subroutine1_0
//   22     //优化用小写
//   23 }
//   24

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   25 void test_io2b(void)
??test_io2b:
//   26 {
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//   27     UINT_BIT_OBJECT<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
        MOV     DPTR,#io
        MOVX    A,@DPTR
        SETB    0xE0 /* A   */.2
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        CLR     0xE0 /* A   */.2
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        XRL     A,#0x4
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        MOV     C,0xE0 /* A   */.2
        JNC     ??test_io2b_1
        MOV     A,#0x1
        SJMP    ??test_io2b_2
??test_io2b_1:
        CLR     A
??test_io2b_2:
        MOV     DPTR,#x
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        CPL     A
        MOV     DPTR,#io
        JZ      ??test_io2b_3
        MOVX    A,@DPTR
        SETB    0xE0 /* A   */.2
        SJMP    ??test_io2b_4
??test_io2b_3:
        MOVX    A,@DPTR
        CLR     0xE0 /* A   */.2
??test_io2b_4:
        SJMP    ??Subroutine1_0
//   28     //防优化用大写
//   29 }
//   30

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   31 void test_io3a(void)
??test_io3a:
//   32 {
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//   33     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
        MOV     A,#0x4
        MOV     DPTR,#x
        MOVX    @DPTR,A
        MOV     A,#-0x5
        SJMP    ?Subroutine0
//   34     //优化用小写   
//   35 }
//   36

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   37 void test_io3b(void)
??test_io3b:
//   38 {
        PUSH    DPL
        PUSH    DPH
        ; Saved register size: 2
        ; Auto size: 0
//   39     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
        MOV     A,#0x3
        MOV     DPTR,#io
        MOVX    @DPTR,A
        MOV     A,#0x4
        MOVX    @DPTR,A
        MOVX    A,@DPTR
        MOV     DPTR,#x
        MOVX    @DPTR,A
        CPL     A
        LJMP    ?Subroutine0
//   40     //防优化用大写
//   41 }
//   42



IAR EWAVR 5.51:
-----------------------------------------------------------------------------
        RSEG CODE:CODE:NOROOT(1)
//    7 void test_io1a(void)
??test_io1a:
//    8 {   
//    9     UINT_OBJECT<uint8>::Attach(&io).set_bit(0).clr_bit(1).write_field(2,3,7).ToUINT_BIT_OBJECT<5>().set().clr().toggle().ToUNIT_FIELD_OBJECT<6,2>().write(2);   
        LDI     R16, 189
        STS     io, R16
//   10    //优化用小写
//   11 }
        RET
//   12

        RSEG CODE:CODE:NOROOT(1)
//   13 void test_io1b(void)
??test_io1b:
//   14 {   
//   15     UINT_OBJECT<uint8>::Attach(&io).Set_Bit(0).Clr_Bit(1).Write_Field(2,3,7).ToUINT_BIT_OBJECT<5>().Set().Clr().Toggle().ToUNIT_FIELD_OBJECT<6,2>().Write(2);   
        LDI     R30, LOW(io)
        LDI     R31, (io) >> 8
        LD      R16, Z
        ORI     R16, 0x01
        ST      Z, R16
        LD      R16, Z
        ANDI    R16, 0xFD
        ST      Z, R16
        LD      R16, Z
        ORI     R16, 0x1C
        ST      Z, R16
        LD      R16, Z
        ORI     R16, 0x20
        ST      Z, R16
        LD      R16, Z
        ANDI    R16, 0xDF
        ST      Z, R16
        LDI     R16, 32
        LD      R17, Z
        EOR     R17, R16
        ST      Z, R17
        LD      R16, Z
        ANDI    R16, 0xBF
        ORI     R16, 0x80
        ST      Z, R16
//   16    //防优化用大写
//   17 }
        RET
//   18

        RSEG CODE:CODE:NOROOT(1)
//   19 void test_io2a(void)
??test_io2a:
//   20 {
//   21     UINT_BIT_OBJECT<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
        LDI     R30, LOW(io)
        LDI     R31, (io) >> 8
        LD      R17, Z
        ANDI    R17, 0xDF
        LDI     R16, 32
        EOR     R17, R16
        ST      Z, R17
        LD      R16, Z
        SBRS    R16, 5
        RJMP    ??test_io2a_1
        LDI     R16, 1
        RJMP    ??test_io2a_2
??test_io2a_1:
        LDI     R16, 0
??test_io2a_2:
        STD     Z+1, R16
        LDD     R16, Z+1
        COM     R16
        LD      R16, Z
        BREQ    ??test_io2a_3
        ORI     R16, 0x20
        RJMP    ??test_io2a_4
??test_io2a_3:
        ANDI    R16, 0xDF
??test_io2a_4:
        ST      Z, R16
//   22     //优化用小写
//   23 }
        RET
//   24

        RSEG CODE:CODE:NOROOT(1)
//   25 void test_io2b(void)
??test_io2b:
//   26 {
//   27     UINT_BIT_OBJECT<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
        LDI     R30, LOW(io)
        LDI     R31, (io) >> 8
        LD      R16, Z
        ORI     R16, 0x04
        ST      Z, R16
        LD      R16, Z
        ANDI    R16, 0xFB
        ST      Z, R16
        LDI     R16, 4
        LD      R17, Z
        EOR     R17, R16
        ST      Z, R17
        LD      R16, Z
        SBRS    R16, 2
        RJMP    ??test_io2b_1
        LDI     R16, 1
        RJMP    ??test_io2b_2
??test_io2b_1:
        LDI     R16, 0
??test_io2b_2:
        STD     Z+1, R16
        LDD     R16, Z+1
        COM     R16
        LD      R16, Z
        BREQ    ??test_io2b_3
        ORI     R16, 0x04
        RJMP    ??test_io2b_4
??test_io2b_3:
        ANDI    R16, 0xFB
??test_io2b_4:
        ST      Z, R16
//   28     //防优化用大写
//   29 }
        RET
//   30

        RSEG CODE:CODE:NOROOT(1)
//   31 void test_io3a(void)
??test_io3a:
//   32 {
//   33     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
        LDI     R16, 4
        STS     (io + 1), R16
        LDI     R16, 251
        STS     io, R16
//   34     //优化用小写   
//   35 }
        RET
//   36

        RSEG CODE:CODE:NOROOT(1)
//   37 void test_io3b(void)
??test_io3b:
//   38 {
//   39     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
        LDI     R30, LOW(io)
        LDI     R31, (io) >> 8
        LDI     R16, 3
        ST      Z, R16
        LDI     R16, 4
        ST      Z, R16
        LD      R16, Z
        STD     Z+1, R16
        COM     R16
        ST      Z, R16
//   40     //防优化用大写
//   41 }
        RET
//   42




IAR EWSTM8 1.30:
-----------------------------------------------------------------------------      
  SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//    7 void test_io1a(void)
//    8 {   
//    9     UINT_OBJECT<uint8>::Attach(&io).set_bit(0).clr_bit(1).write_field(2,3,7).ToUINT_BIT_OBJECT<5>().set().clr().toggle().ToUNIT_FIELD_OBJECT<6,2>().write(2);   
_Z9test_io1av:
        MOV       L:io, #0xbd
//   10    //优化用小写
//   11 }
        RET
//   12

        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//   13 void test_io1b(void)
//   14 {   
//   15     UINT_OBJECT<uint8>::Attach(&io).Set_Bit(0).Clr_Bit(1).Write_Field(2,3,7).ToUINT_BIT_OBJECT<5>().Set().Clr().Toggle().ToUNIT_FIELD_OBJECT<6,2>().Write(2);   
_Z9test_io1bv:
        BSET      L:io, #0x0
        BRES      L:io, #0x1
        LD        A, L:io
        OR        A, #0x1c
        LD        L:io, A
        BSET      L:io, #0x5
        BRES      L:io, #0x5
        LD        A, L:io
        XOR       A, #0x20
        LD        L:io, A
        LD        A, L:io
        AND       A, #0xbf
        OR        A, #0x80
        LD        L:io, A
//   16    //防优化用大写
//   17 }
        RET
//   18

        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//   19 void test_io2a(void)
//   20 {
//   21     UINT_BIT_OBJECT<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
_Z9test_io2av:
        LD        A, L:io
        AND       A, #0xdf
        XOR       A, #0x20
        LD        L:io, A
        MOV       L:`x`, #0x1
//   22     //优化用小写
//   23 }
        RET
//   24

        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//   25 void test_io2b(void)
//   26 {
//   27     UINT_BIT_OBJECT<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
_Z9test_io2bv:
        BSET      L:io, #0x2
        BRES      L:io, #0x2
        LD        A, L:io
        XOR       A, #0x4
        LD        L:io, A
        BTJF      L:io, #0x2, L:??test_io2b_0
        MOV       L:`x`, #0x1
        JRA       L:??test_io2b_1
??test_io2b_0:
        CLR       L:`x`
??test_io2b_1:
        BSET      L:io, #0x2
//   28     //防优化用大写
//   29 }
        RET
//   30

        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//   31 void test_io3a(void)
//   32 {
//   33     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
_Z9test_io3av:
        MOV       L:`x`, #0x4
        MOV       L:io, #0xfb
//   34     //优化用小写   
//   35 }
        RET
//   36

        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
        CODE
//   37 void test_io3b(void)
//   38 {
//   39     UINT_FIELD_OBJECT<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
_Z9test_io3bv:
        MOV       L:io, #0x3
        MOV       L:io, #0x4
        LD        A, L:io
        LD        L:`x`, A
        CPL       A
        LD        L:io, A
//   40     //防优化用大写
//   41 }
        RET
//   42


51的RAM(XDATA)操作能力最差,AVR的RAM操作能力也不强。
STM8的RAM操作能力超强。

STM8的位翻转编译器编译器应该优化成一条BCPL的指令,IARSTM8优化还做得不够。

相关帖子

沙发
hqgboy| | 2011-7-9 11:54 | 只看该作者
hao ...ding ....

使用特权

评论回复
板凳
ansen520| | 2011-7-9 16:08 | 只看该作者
budong

使用特权

评论回复
地板
hotpower| | 2011-7-9 23:38 | 只看该作者
眼晕

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:该死的ST,还不赶快出STM8L小FLASH片子

0

主题

262

帖子

1

粉丝