本帖最后由 CC2530 于 2011-5-10 11:05 编辑
c++ 我也来试试:
测试代码改成:typedef struct SA
{
char x;
} A;
A a1, a2;
void test1 (void)
{
a1 = a2;
}
void test2 (void)
{
A a1, a2;
a1 = a2;
}
C++Builder 2009File1.cpp.23: void test1 (void)
00401168 55 push ebp
00401169 8BEC mov ebp,esp
File1.cpp.25: a1 = a2;
0040116B A075214000 mov al,[$00402175]
00401170 A274214000 mov [$00402174],al
File1.cpp.26: }
00401175 5D pop ebp
00401176 C3 ret
00401177 90 nop
File1.cpp.28: void test2 (void)
00401178 55 push ebp
00401179 8BEC mov ebp,esp
0040117B 51 push ecx
File1.cpp.31: a1 = a2;
0040117C 8A45FE mov al,[ebp-$02]
0040117F 8845FF mov [ebp-$01],al
File1.cpp.32: }
00401182 59 pop ecx
00401183 5D pop ebp
00401184 C3 ret
VC 2008
void test1 (void)
{
004113B0 push ebp
004113B1 mov ebp,esp
004113B3 sub esp,0C0h
004113B9 push ebx
004113BA push esi
004113BB push edi
004113BC lea edi,[ebp-0C0h]
004113C2 mov ecx,30h
004113C7 mov eax,0CCCCCCCCh
004113CC rep stos dword ptr es:[edi]
a1 = a2;
004113CE mov al,byte ptr [a2 (417140h)]
004113D3 mov byte ptr [a1 (417141h)],al
}
004113D8 pop edi
004113D9 pop esi
004113DA pop ebx
004113DB mov esp,ebp
004113DD pop ebp
004113DE ret
void test2 (void)
{
004113F0 push ebp
004113F1 mov ebp,esp
004113F3 sub esp,0D8h
004113F9 push ebx
004113FA push esi
004113FB push edi
004113FC lea edi,[ebp-0D8h]
00411402 mov ecx,36h
00411407 mov eax,0CCCCCCCCh
0041140C rep stos dword ptr es:[edi]
A a1, a2;
a1 = a2;
0041140E mov al,byte ptr [a2]
00411411 mov byte ptr [a1],al
}
00411414 push edx
00411415 mov ecx,ebp
00411417 push eax
00411418 lea edx,[ (41142Ch)]
0041141E call @ILT+140(@_RTC_CheckStackVars@8) (411091h)
00411423 pop eax
00411424 pop edx
00411425 pop edi
00411426 pop esi
00411427 pop ebx
00411428 mov esp,ebp
0041142A pop ebp
0041142B ret
IAR AVR 5.51 C++
RSEG CODE:CODE:NOROOT(1)
// 13 void test1 (void)
??test1:
// 14
// 15 {
// 16
// 17 a1 = a2;
LDS R16, (a1 + 1)
STS a1, R16
// 18
// 19 }
RET
// 20
// 21
// 22
RSEG CODE:CODE:NOROOT(1)
// 23 void test2 (void)
??test2:
// 24
// 25 {
// 26
// 27 A a1, a2;
// 28
// 29 a1 = a2;
// 30
// 31 }
RET
IAR ARM 5.41 C++
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 15 void test1 (void)
// 16
// 17 {
// 18
// 19 a1 = a2;
_Z5test1v:
LDR.N R0,??DataTable0 ;; a1
LDR R1,[R0, #+4]
STR R1,[R0, #+0]
// 20
// 21 }
BX LR ;; return
SECTION `.text`:CODE:NOROOT(2)
DATA
??DataTable0:
DC32 a1
// 22
// 23
// 24
SECTION `.text`:CODE:NOROOT(1)
THUMB
// 25 void test2 (void)
// 26
// 27 {
// 28
// 29 A a1, a2;
// 30
// 31 a1 = a2;
// 32
// 33 }
_Z5test2v:
BX LR ;; return
IAR 430 5.20 C++
RSEG CODE:CODE:REORDER:NOROOT(1)
// 15 void test1 (void)
??test1:
// 16
// 17 {
// 18
// 19 a1 = a2;
MOV.B &a2, &a1
// 20
// 21 }
RET
// 22
// 23
// 24
RSEG CODE:CODE:REORDER:NOROOT(1)
// 25 void test2 (void)
??test2:
// 26
// 27 {
// 28
// 29 A a1, a2;
// 30
// 31 a1 = a2;
// 32
// 33 }
RET
IAR STM8 1.3 C++
SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
CODE
// 15 void test1 (void)
// 16
// 17 {
// 18
// 19 a1 = a2;
_Z5test1v:
LD A, L:a2
LD L:a1, A
// 20
// 21 }
RET
// 22
// 23
// 24
SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)
CODE
// 25 void test2 (void)
// 26
// 27 {
// 28
// 29 A a1, a2;
// 30
// 31 a1 = a2;
// 32
// 33 }
_Z5test2v:
RET
|