本帖最后由 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优化还做得不够。 |