6: int main(int argc, char* argv[])
7: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,50h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-50h]
0040101C mov ecx,14h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
//
处理局部空间的初始化
8: char a[] =
"Hi,ABC!"
;
//
我们看看是怎么对数组a的处理的
00401028 mov eax,[string
"Hi,ABC!"
(00422024)]
//
把a的前4项:Hi,A 的ASCII码保存在了eax ,下面又把它放在了局部变量空间里面
0040102D mov dword ptr [ebp-8],eax
00401030 mov ecx,dword ptr [string
"Hi,ABC!"
+4 (00422028)]
//
后3项的处理(为了CPU取数据快些,变量都是存放在偶数内存空间的)
00401036 mov dword ptr [ebp-4],ecx
9: char *p =
"Hi,ABC!"
;
//
我们看看对于指针的处理,offset明白了吧,是把字符窜的地址存放在局部空间里
00401039 mov dword ptr [ebp-0Ch],offset string
"Hi,ABC!"
(00422024)
10:
for
(int i=0;i<=7;i++)
00401040 mov dword ptr [ebp-10h],0
00401047 jmp main+42h (00401052)
00401049 mov edx,dword ptr [ebp-10h]
0040104C add edx,1
0040104F mov dword ptr [ebp-10h],edx
00401052
cmp
dword ptr [ebp-10h],7
00401056 jg main+6Ah (0040107a)
11: {
12:
printf
(
"%c%c\n"
,a[i],p[i]);
//
下面是重点了,数组与指针的不同
00401058 mov eax,dword ptr [ebp-0Ch]
//
指针p的值
0040105B add eax,dword ptr [ebp-10h]
//p
+1
0040105E movsx ecx,byte ptr [eax] [COLOR=red]
//
这个是理解的关键,需要再一次取地址转换,才能得到字符串的值!![
/COLOR
]
00401061 push ecx
00401062 mov edx,dword ptr [ebp-10h]
//i
的值
00401065 movsx eax,byte ptr [ebp+edx-8]
//
从a的位置开始,向后移动i个字节,然后取出其中的字符。
0040106A push eax
0040106B push offset string
"%c%c\n"
(0042201c)
00401070 call
printf
(004010b0)
00401075 add esp,0Ch
13: }
00401078 jmp main+39h (00401049)
14:
15:
return
0;
0040107A xor eax,eax
16: }