天书夜读第二章程序解决办法
天书夜读第二章程序
[code=C/C++][/code]这是源代码:下面是反汇编代码
#include "stdafx.h"
typedef enum
{
ENUM_1=2,ENUM_2=6,ENUM_3,ENUM_4,
}myenum;
typedef struct
{
int a;
int b;
int c;
}mystruct;
typedef union
{
mystruct s;
myenum e[3];
}myunion;
int main(int argc, char* argv[])
{
unsigned char buf[100]={0};
myunion *uns=(myunion *)buf;
for (int i=0;i<5;i++)
{
uns[i].s.a=0;
uns[i].s.b=1;
uns[i].e[2]=ENUM_4;
}
return 0;
}
1: // 00014.cpp : Defines the entry point for the console application.
2: //
3:
4: #include "stdafx.h"
5:
6: typedef enum
7: {
8: ENUM_1=2,ENUM_2=6,ENUM_3,ENUM_4,
9: }myenum;
10:
11: typedef struct
12: {
13: int a;
14: int b;
15: int c;
16: }mystruct;
17:
18: typedef union
19: {
20: mystruct s;
21: myenum e[3];
22: }myunion;
23:
24: int main(int argc, char* argv[])
25: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,0ACh
00401019 push ebx
0040101A push esi
0040101B push edi
0040101C lea edi,[ebp-0ACh]
00401022 mov ecx,2Bh
00401027 mov eax,0CCCCCCCCh
0040102C rep stos dword ptr [edi]
26:
27: unsigned char buf[100]={0};
0040102E mov byte ptr [ebp-64h],0
00401032 mov ecx,18h
00401037 xor eax,eax
00401039 lea edi,[ebp-63h] ???????????我的问题在这里,这里问什么会取 63呢,希望高手给以解答,十分感谢。就是要初始化一百个0,他这样子不对齐,后面还有两句单独 的STOS,一个是字节写入一个字写入。为什么要这样设计 呢。。。是不是哪个知识点我没学过或没理解到位?高手们啊。
0040103C rep stos dword ptr [edi]
0040103E stos word ptr [edi]
00401040 stos byte ptr [edi]
28: myunion *uns=(myunion *)buf;
00401041 lea eax,[ebp-64h]
00401044 mov dword ptr [ebp-68h],eax
29: for (int i=0;i<5;i++)
00401047 mov dword ptr [ebp-6Ch],0
0040104E jmp main+49h (00401059)
00401050 mov ecx,dword ptr [ebp-6Ch]
00401053 add ecx,1
00401056 mov dword ptr [ebp-6Ch],ecx
00401059 cmp dword ptr [ebp-6Ch],5
0040105D jge main+83h (00401093)
30: {
31: uns[i].s.a=0;
0040105F mov edx,dword ptr [ebp-6Ch]
00401062 imul edx,edx,0Ch
00401065 mov eax,dword ptr [ebp-68h]
00401068 mov dword ptr [eax+edx],0
32: uns[i].s.b=1;
0040106F mov ecx,dword ptr [ebp-6Ch]
00401072 imul ecx,ecx,0Ch
00401075 mov edx,dword ptr [ebp-68h]
00401078 mov dword ptr [edx+ecx+4],1
33: uns[i].e[2]=ENUM_4;
00401080 mov eax,dword ptr [ebp-6Ch]
00401083 imul eax,eax,0Ch
00401086 mov ecx,dword ptr [ebp-68h]
00401089 mov dword ptr [ecx+eax+8],8
34: }
00401091 jmp main+40h (00401050)
35: return 0;
00401093 xor eax,eax
36: }
00401095 pop edi
00401096 pop esi
00401097 pop ebx
00401098 mov esp,ebp
0040109A pop ebp
0040109B ret
------解决方案--------------------
lea edi,[ebp-63h]
要理解这句,就要清楚
[code=C/C++][/code]这是源代码:下面是反汇编代码
#include "stdafx.h"
typedef enum
{
ENUM_1=2,ENUM_2=6,ENUM_3,ENUM_4,
}myenum;
typedef struct
{
int a;
int b;
int c;
}mystruct;
typedef union
{
mystruct s;
myenum e[3];
}myunion;
int main(int argc, char* argv[])
{
unsigned char buf[100]={0};
myunion *uns=(myunion *)buf;
for (int i=0;i<5;i++)
{
uns[i].s.a=0;
uns[i].s.b=1;
uns[i].e[2]=ENUM_4;
}
return 0;
}
1: // 00014.cpp : Defines the entry point for the console application.
2: //
3:
4: #include "stdafx.h"
5:
6: typedef enum
7: {
8: ENUM_1=2,ENUM_2=6,ENUM_3,ENUM_4,
9: }myenum;
10:
11: typedef struct
12: {
13: int a;
14: int b;
15: int c;
16: }mystruct;
17:
18: typedef union
19: {
20: mystruct s;
21: myenum e[3];
22: }myunion;
23:
24: int main(int argc, char* argv[])
25: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,0ACh
00401019 push ebx
0040101A push esi
0040101B push edi
0040101C lea edi,[ebp-0ACh]
00401022 mov ecx,2Bh
00401027 mov eax,0CCCCCCCCh
0040102C rep stos dword ptr [edi]
26:
27: unsigned char buf[100]={0};
0040102E mov byte ptr [ebp-64h],0
00401032 mov ecx,18h
00401037 xor eax,eax
00401039 lea edi,[ebp-63h] ???????????我的问题在这里,这里问什么会取 63呢,希望高手给以解答,十分感谢。就是要初始化一百个0,他这样子不对齐,后面还有两句单独 的STOS,一个是字节写入一个字写入。为什么要这样设计 呢。。。是不是哪个知识点我没学过或没理解到位?高手们啊。
0040103C rep stos dword ptr [edi]
0040103E stos word ptr [edi]
00401040 stos byte ptr [edi]
28: myunion *uns=(myunion *)buf;
00401041 lea eax,[ebp-64h]
00401044 mov dword ptr [ebp-68h],eax
29: for (int i=0;i<5;i++)
00401047 mov dword ptr [ebp-6Ch],0
0040104E jmp main+49h (00401059)
00401050 mov ecx,dword ptr [ebp-6Ch]
00401053 add ecx,1
00401056 mov dword ptr [ebp-6Ch],ecx
00401059 cmp dword ptr [ebp-6Ch],5
0040105D jge main+83h (00401093)
30: {
31: uns[i].s.a=0;
0040105F mov edx,dword ptr [ebp-6Ch]
00401062 imul edx,edx,0Ch
00401065 mov eax,dword ptr [ebp-68h]
00401068 mov dword ptr [eax+edx],0
32: uns[i].s.b=1;
0040106F mov ecx,dword ptr [ebp-6Ch]
00401072 imul ecx,ecx,0Ch
00401075 mov edx,dword ptr [ebp-68h]
00401078 mov dword ptr [edx+ecx+4],1
33: uns[i].e[2]=ENUM_4;
00401080 mov eax,dword ptr [ebp-6Ch]
00401083 imul eax,eax,0Ch
00401086 mov ecx,dword ptr [ebp-68h]
00401089 mov dword ptr [ecx+eax+8],8
34: }
00401091 jmp main+40h (00401050)
35: return 0;
00401093 xor eax,eax
36: }
00401095 pop edi
00401096 pop esi
00401097 pop ebx
00401098 mov esp,ebp
0040109A pop ebp
0040109B ret
------解决方案--------------------
lea edi,[ebp-63h]
要理解这句,就要清楚
- C/C++ code
unsigned char buf[100]={0};