能力值:
(RANK:170 )
|
-
-
2 楼
如果你们都觉得太简单就太伤我学习积极性啦
|
能力值:
( 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中的代码.
|
能力值:
(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
|
能力值:
(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
|
能力值:
(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)
我找了好久
|
能力值:
(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
|
能力值:
( LV12,RANK:660 )
|
-
-
8 楼
宏只是简单替换。
|
能力值:
( LV12,RANK:290 )
|
-
-
9 楼
汗....你们几个....至于用汇编么
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
用汇编更好的理解代码
|
能力值:
( LV13,RANK:420 )
|
-
-
11 楼
这里只是想说明问题!汇编后的结果会更清晰地知道,宏是怎么运行的!没有什么!
|
能力值:
( LV12,RANK:650 )
|
-
-
12 楼
都不知道是好事还是坏事了。动不动就是分析汇编……
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
没什么的
从编译器的文档可以查到宏是怎么做的
体现在机器码上就是汇编了呗
:)
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
简单宏替换,不至于用汇编分析吧
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
楼主精神可佳
|
|
|