- 论坛徽章:
- 0
|
回复 #1 太平绅士 的帖子
Eclipse + Cygwin + GCC + vista 下:
源代码:
int main(void) {
int m = sizeof("abcde" + 3 );
int n = sizeof('a' + 3 );
printf( "m=%d,n=%d,str=%s,c=%c\r\n", m,n, "abcde" + 3, 'a' + 3);
return EXIT_SUCCESS;
}
反汇编:地址0x00402000-0x00402005 存储 “abcde”
00401075 |. E8 D2000000 call <jmp.&cygwin1.__main>
0040107A |. C745 FC 04000>mov dword ptr [ebp-4], 4 ; |;计算int m = sizeof("abcde" + 3 );
00401081 |. C745 F8 04000>mov dword ptr [ebp-8], 4 ; |;计算int n = sizeof('a' + 3 );
00401088 |. C74424 10 640>mov dword ptr [esp+10], 64 ; |;压栈'a' + 3
00401090 |. C74424 0C 032>mov dword ptr [esp+C], 00402003 ; |ASCII"de" ;压栈"abcde" + 3
00401098 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; |
0040109B |. 894424 08 mov dword ptr [esp+8], eax ; |;压栈n
0040109F |. 8B45 FC mov eax, dword ptr [ebp-4] ; |
004010A2 |. 894424 04 mov dword ptr [esp+4], eax ; |;压栈m
004010A6 |. C70424 062040>mov dword ptr [esp], 00402006 ; |ASCII "m=%d,n=%d,str=%s,c=%c",CR,LF
004010AD |. E8 AA000000 call <jmp.&cygwin1.printf> ; \printf
004010B2 |. B8 00000000 mov eax, 0
004010B7 |. C9 leave
004010B8 \. C3 retn
说明:sizeof在计算"abcde" + 3 ,'a' +3 都是 4
但"abcde" + 3 作为参数 得到是 地址, 'a' +3 得到的是61+3;
------------------------------------------------------------------------------------
vs2008 + vista
源代码:
void main()
{
__asm {
mov eax, 0x1
add eax, 0x1
add eax, 0x1
add eax, 0x1
}
int m = sizeof("abcde" + 3 );
int n = sizeof('a' + 3 );
printf( "m=%d,n=%d,str=%s,c=%c\r\n", m,n, "abcde" + 3, 'a' + 3);
}
反汇编:地址0x013B57AC-0x013B57B0 存储 “abcde”
013B17CE B8 01000000 mov eax, 1
013B17D3 83C0 01 add eax, 1
013B17D6 83C0 01 add eax, 1
013B17D9 83C0 01 add eax, 1
013B17DC C745 F8 0600000>mov dword ptr [ebp-8], 6 ; ;计算int m = sizeof("abcde" + 3 );
013B17E3 C745 EC 0400000>mov dword ptr [ebp-14], 4 ; ;计算int n = sizeof('a' + 3 );
013B17EA 8BF4 mov esi, esp
013B17EC 6A 64 push 64 ; ;压栈'a' + 3
013B17EE 68 AF573B01 push 013B57AF ; ASCII "de"
013B17F3 8B45 EC mov eax, dword ptr [ebp-14]
013B17F6 50 push eax ; ;压栈n
013B17F7 8B4D F8 mov ecx, dword ptr [ebp-8]
013B17FA 51 push ecx ; ;压栈m
013B17FB 68 185C3B01 push 013B5C18 ; ASCII "m=%d,n=%d,str=%s,c=%c",CR,LF
013B1800 FF15 B4823B01 call dword ptr [<&MSVCR90D.printf>] ; MSVCR90D.printf
说明:
计算sizeof("abcde" + 3)结果为6,而计算sizeof('a'+3)结果为4;
作为参数"abcde" + 3 算的 结果是地址,'a'+3 为61+3;
感觉 GCC 把"abcde" + 3 当作 地址 来看待 还是 合理一些,统一些。
[ 本帖最后由 63956372 于 2009-2-11 15:31 编辑 ] |
|