小题目大学问--C语言输出问题
2013-10-15 22:38
232 查看
原题:C语言输出问题
#include<stdio.h>
int main(void)
{
int a=5,b=5,q,p;
//q=(a++)+(a++)+(a++);
p=(++b)+(++b)+(++b);
printf("q:%d\n",q);
printf("p:%d\n",p);
getchar();
return 0;
}
图解:
反汇编代码:vc6.0 (不同编译器不同)F5
1: #include<stdio.h>
2: int main(void)
3: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,54h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-54h]
0040101C mov ecx,15h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
4: int a=5,b=5,q,p;
00401028 mov dword ptr [ebp-4],5
0040102F mov dword ptr [ebp-8],5 //b
5: q=(a++)+(a++)+(a++);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,dword ptr [ebp-4]
0040103C add eax,dword ptr [ebp-4]
0040103F mov dword ptr [ebp-0Ch],eax
00401042 mov ecx,dword ptr [ebp-4]
00401045 add ecx,1
00401048 mov dword ptr [ebp-4],ecx
0040104B mov edx,dword ptr [ebp-4]
0040104E add edx,1
00401051 mov dword ptr [ebp-4],edx
00401054 mov eax,dword ptr [ebp-4]
00401057 add eax,1
0040105A mov dword ptr [ebp-4],eax
6: p=(++b)+(++b)+(++b);
0040105D mov ecx,dword ptr [ebp-8] //ecx=5
00401060 add ecx,1 //ecx=ecx+1=6
00401063 mov dword ptr [ebp-8],ecx //b=6
00401066 mov edx,dword ptr [ebp-8] //edx=ecx=6
00401069 add edx,1 //edx=7
0040106C mov dword ptr [ebp-8],edx //b=7
0040106F mov eax,dword ptr [ebp-8] //eax=7
00401072 add eax,dword ptr [ebp-8] //eax=eax+b=7+7=14
00401075 mov ecx,dword ptr [ebp-8] //ecx=b=7
00401078 add ecx,1 // ecx=8
0040107B mov dword ptr [ebp-8],ecx //b=8
0040107E add eax,dword ptr [ebp-8] //eax=eax+b=14+8=22
00401081 mov dword ptr [ebp-10h],eax //22
7: printf("q:%d\n",q);
00401084 mov edx,dword ptr [ebp-0Ch]
00401087 push edx
00401088 push offset string "q:%d\n" (00423024)
0040108D call printf (00401470)
00401092 add esp,8
8: printf("p:%d\n",p);
00401095 mov eax,dword ptr [ebp-10h]
00401098 push eax
00401099 push offset string "p:%d\n" (0042301c)
0040109E call printf (00401470)
004010A3 add esp,8
9: getchar();
004010A6 mov ecx,dword ptr [__iob+4 (00425a34)]
004010AC sub ecx,1
004010AF mov dword ptr [__iob+4 (00425a34)],ecx
004010B5 cmp dword ptr [__iob+4 (00425a34)],0
004010BC jl main+0D0h (004010e0)
004010BE mov edx,dword ptr [__iob (00425a30)]
004010C4 movsx eax,byte ptr [edx]
004010C7 and eax,0FFh
004010CC mov dword ptr [ebp-14h],eax
004010CF mov ecx,dword ptr [__iob (00425a30)]
004010D5 add ecx,1
004010D8 mov dword ptr [__iob (00425a30)],ecx
004010DE jmp main+0E0h (004010f0)
004010E0 push offset __iob (00425a30)
004010E5 call _filbuf (00401140)
004010EA add esp,4
004010ED mov dword ptr [ebp-14h],eax
10: return 0;
004010F0 xor eax,eax
11: }
004010F2 pop edi
004010F3 pop esi
004010F4 pop ebx
004010F5 add esp,54h
004010F8 cmp ebp,esp
004010FA call __chkesp (004014f0)
004010FF mov esp,ebp
00401101 pop ebp
00401102 ret
#include<stdio.h>
int main(void)
{
int a=5,b=5,q,p;
//q=(a++)+(a++)+(a++);
p=(++b)+(++b)+(++b);
printf("q:%d\n",q);
printf("p:%d\n",p);
getchar();
return 0;
}
图解:
反汇编代码:vc6.0 (不同编译器不同)F5
1: #include<stdio.h>
2: int main(void)
3: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,54h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-54h]
0040101C mov ecx,15h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
4: int a=5,b=5,q,p;
00401028 mov dword ptr [ebp-4],5
0040102F mov dword ptr [ebp-8],5 //b
5: q=(a++)+(a++)+(a++);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,dword ptr [ebp-4]
0040103C add eax,dword ptr [ebp-4]
0040103F mov dword ptr [ebp-0Ch],eax
00401042 mov ecx,dword ptr [ebp-4]
00401045 add ecx,1
00401048 mov dword ptr [ebp-4],ecx
0040104B mov edx,dword ptr [ebp-4]
0040104E add edx,1
00401051 mov dword ptr [ebp-4],edx
00401054 mov eax,dword ptr [ebp-4]
00401057 add eax,1
0040105A mov dword ptr [ebp-4],eax
6: p=(++b)+(++b)+(++b);
0040105D mov ecx,dword ptr [ebp-8] //ecx=5
00401060 add ecx,1 //ecx=ecx+1=6
00401063 mov dword ptr [ebp-8],ecx //b=6
00401066 mov edx,dword ptr [ebp-8] //edx=ecx=6
00401069 add edx,1 //edx=7
0040106C mov dword ptr [ebp-8],edx //b=7
0040106F mov eax,dword ptr [ebp-8] //eax=7
00401072 add eax,dword ptr [ebp-8] //eax=eax+b=7+7=14
00401075 mov ecx,dword ptr [ebp-8] //ecx=b=7
00401078 add ecx,1 // ecx=8
0040107B mov dword ptr [ebp-8],ecx //b=8
0040107E add eax,dword ptr [ebp-8] //eax=eax+b=14+8=22
00401081 mov dword ptr [ebp-10h],eax //22
7: printf("q:%d\n",q);
00401084 mov edx,dword ptr [ebp-0Ch]
00401087 push edx
00401088 push offset string "q:%d\n" (00423024)
0040108D call printf (00401470)
00401092 add esp,8
8: printf("p:%d\n",p);
00401095 mov eax,dword ptr [ebp-10h]
00401098 push eax
00401099 push offset string "p:%d\n" (0042301c)
0040109E call printf (00401470)
004010A3 add esp,8
9: getchar();
004010A6 mov ecx,dword ptr [__iob+4 (00425a34)]
004010AC sub ecx,1
004010AF mov dword ptr [__iob+4 (00425a34)],ecx
004010B5 cmp dword ptr [__iob+4 (00425a34)],0
004010BC jl main+0D0h (004010e0)
004010BE mov edx,dword ptr [__iob (00425a30)]
004010C4 movsx eax,byte ptr [edx]
004010C7 and eax,0FFh
004010CC mov dword ptr [ebp-14h],eax
004010CF mov ecx,dword ptr [__iob (00425a30)]
004010D5 add ecx,1
004010D8 mov dword ptr [__iob (00425a30)],ecx
004010DE jmp main+0E0h (004010f0)
004010E0 push offset __iob (00425a30)
004010E5 call _filbuf (00401140)
004010EA add esp,4
004010ED mov dword ptr [ebp-14h],eax
10: return 0;
004010F0 xor eax,eax
11: }
004010F2 pop edi
004010F3 pop esi
004010F4 pop ebx
004010F5 add esp,54h
004010F8 cmp ebp,esp
004010FA call __chkesp (004014f0)
004010FF mov esp,ebp
00401101 pop ebp
00401102 ret
相关文章推荐
- C语言输出问题
- [黑马程序员]01 [c语言][重要的知识点]printf函数和scanf函数的数据输出与读取问题
- 【C语言最基础的输出问题】
- 解决C语言编译时,输出台一闪而过的问题
- C语言---VS2017---输出中文乱码问题解决方案
- C语言中格式化输出,四舍五入类型问题
- c语言输出小数的格式问题
- C语言求矩阵偶数的平均值和程序输出某数的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- 3. 1.C语言和OC结合题目 // 从控制台输入用户名和密码, 然后 判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功
- c语言:输出一个数组,判断是否存在问题,若有,请找出问题并改正
- C语言输出乱码问题
- c语言中制表符的输出问题
- C语言将数组中元素的数排序输出的相关问题解决
- 关于C语言的printf输出问题
- C语言 输出格式、宽度问题
- c语言输入输出缓冲区的概念 (字符串和字符输出的问题)
- 一道C语言面试题printf输出问题,高手们都来看看吧
- (转)C语言16进制输出字符型变量问题
- C语言也有大学问——指针问题(一)