首页
社区
课程
招聘
[讨论]大家说说下面的程序的输出
发表于: 2006-7-11 16:46 5051

[讨论]大家说说下面的程序的输出

2006-7-11 16:46
5051
#define MA(x) x*(x-1)
main()
{
int a=1,b=2;
printf("%d \n",MA(1+a+b));
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
2
如果你们都觉得太简单就太伤我学习积极性啦
2006-7-11 17:08
0
雪    币: 289
活跃值: (236)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
3
首先请将程序改写成下面这样:
#include <stdio.h>
#define MA(x) x*(x-1)
void main()
{
int a=1,b=2;
printf("%d \n",MA(1+a+b));
}
输出结果是:8
具体原因:
00401005  /$ /E9 06000000   jmp     main
0040100A  |  |CC            int3
0040100B  |  |CC            int3
0040100C  |  |CC            int3
0040100D  |  |CC            int3
0040100E  |  |CC            int3
0040100F  |  |CC            int3
00401010 >|> \55            push    ebp
00401011  |.  8BEC          mov     ebp, esp
00401013  |.  83EC 48       sub     esp, 48
00401016  |.  53            push    ebx
00401017  |.  56            push    esi
00401018  |.  57            push    edi
00401019  |.  8D7D B8       lea     edi, [ebp-48]
0040101C  |.  B9 12000000   mov     ecx, 12
00401021  |.  B8 CCCCCCCC   mov     eax, CCCCCCCC
00401026  |.  F3:AB         rep     stos dword ptr es:[edi]
00401028  |.  C745 FC 01000>mov     dword ptr [ebp-4], 1
0040102F  |.  C745 F8 02000>mov     dword ptr [ebp-8], 2
00401036  |.  8B45 FC       mov     eax, [ebp-4]
00401039  |.  0345 F8       add     eax, [ebp-8]
0040103C  |.  8B4D F8       mov     ecx, [ebp-8]
0040103F  |.  0FAFC8        imul    ecx, eax
00401042  |.  8B55 FC       mov     edx, [ebp-4]
00401045  |.  8D440A 01     lea     eax, [edx+ecx+1]
00401049  |.  50            push    eax                              ; /<%d>
0040104A  |.  68 1C004200   push    0042001C                         ; |format = "%d ",LF,""
0040104F  |.  E8 2C000000   call    printf                           ; \printf
00401054  |.  83C4 08       add     esp, 8
00401057  |.  5F            pop     edi
00401058  |.  5E            pop     esi
00401059  |.  5B            pop     ebx
0040105A  |.  83C4 48       add     esp, 48
0040105D  |.  3BEC          cmp     ebp, esp
0040105F  |.  E8 9C000000   call    _chkesp
00401064  |.  8BE5          mov     esp, ebp
00401066  |.  5D            pop     ebp
00401067  \.  C3            retn

这是VC++编译后在OLLDBG中的代码.
2006-7-11 17:10
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
1+a+b*(1+a+b-1)
=1+1+2*(1+1+2-1)
=1+1+2*3
=1+1+6
=8
2006-7-11 17:14
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
我的用VC编译出来后的代码:
00401000  /$  6A 08         PUSH 8
00401002  |.  68 38804000   PUSH TEST64.00408038                     ;  ASCII "%d
"
00401007  |.  E8 A4000000   CALL TEST64.004010B0
00401019  \.  C3            RETN
2006-7-11 17:17
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
6
最初由 小虾 发布
1+a+b*(1+a+b-1)
=1+1+2*(1+1+2-1)
=1+1+2*3
=1+1+6
=8


我后来才想到这个的,
看来写用define真的要好小心,
一定要用括号括起来,5555,
#define MA(x) (x)*(x-1)
我找了好久
2006-7-11 17:23
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
7
最初由 jhlqb 发布
首先请将程序改写成下面这样:
#include <stdio.h>
#define MA(x) x*(x-1)
void main()
{
........

谢谢,
关键就是这个:
00401028  |.  C745 FC 01000>mov     dword ptr [ebp-4], 1
0040102F  |.  C745 F8 02000>mov     dword ptr [ebp-8], 2
00401036  |.  8B45 FC       mov     eax, [ebp-4]
00401039  |.  0345 F8       add     eax, [ebp-8]
0040103C  |.  8B4D F8       mov     ecx, [ebp-8]
0040103F  |.  0FAFC8        imul    ecx, eax
00401042  |.  8B55 FC       mov     edx, [ebp-4]
00401045  |.  8D440A 01     lea     eax, [edx+ecx+1]

eax=1+2
ecx=2*eax
edx=1
eax=1+edx+ecx
2006-7-11 17:35
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
8
宏只是简单替换。
2006-7-11 19:06
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
9
汗....你们几个....至于用汇编么
2006-7-12 00:10
0
雪    币: 250
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
用汇编更好的理解代码
2006-7-12 02:17
0
雪    币: 289
活跃值: (236)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
11
这里只是想说明问题!汇编后的结果会更清晰地知道,宏是怎么运行的!没有什么!
2006-7-12 21:51
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
12
都不知道是好事还是坏事了。动不动就是分析汇编……
2006-7-13 08:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
没什么的
从编译器的文档可以查到宏是怎么做的
体现在机器码上就是汇编了呗
:)
2006-7-30 15:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
简单宏替换,不至于用汇编分析吧
2006-7-31 01:40
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
楼主精神可佳
2006-8-2 19:20
0
游客
登录 | 注册 方可回帖
返回
//