首先需要明白的两个概念:
指针:普通变量的地址
指针变量:该变量内存放的是指针
程序分析如下:
#include<stdio.h>
void main(){
int a,b;
a = 10;
b = 100;
int *pointa,*pointb; //声明 *只是表示指针类型 int表示只能指向长度为4字节的int类型
pointa = &a; //指针存放地址,&取地址
pointb = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointa,*pointb); // *表示去内容,和声明时*含义不同(注意区分)
}
@ILT+0(_main):
00401005 jmp main (00401010) //main作为跳转首地址
0040100A int 3 //类型3(专用:断点中断)中断 机器码0cch 是留给调试工具使用的中断
0040100B int 3
0040100C int 3
0040100D int 3
0040100E int 3
0040100F int 3
--- C:\point.cpp -----------------------------------------------------------------------------------------------------------------
1: #include<stdio.h>
2:
3: void main(){ //调用main 保存原寄存器内容 入栈操作
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]
4: int a,b;
5: a = 10;
00401028 mov dword ptr [ebp-4],0Ah //局部变量在不同环境下存放不同内存(即可马上销毁) 入栈ss
6: b = 100;
0040102F mov dword ptr [ebp-8],64h
7: int *pointa,*pointb;
8: pointa = &a;
00401036 lea eax,[ebp-4] //取局部变量a的偏移地址给eax(int 4字节)
00401039 mov dword ptr [ebp-0Ch],eax
9: pointb = &b;
0040103C lea ecx,[ebp-8]
0040103F mov dword ptr [ebp-10h],ecx
10: printf("%d,%d\n",a,b);
00401042 mov edx,dword ptr [ebp-8] //从右到左依此入栈
00401045 push edx
00401046 mov eax,dword ptr [ebp-4]
00401049 push eax
0040104A push offset string "%d,%d\n" (0042201c)
0040104F call printf (004010a0) //系统调用 004010a0和下面系统调用统一操作
00401054 add esp,0Ch
11: printf("%d,%d\n",*pointa,*pointb);
00401057 mov ecx,dword ptr [ebp-10h] //取地址 给ecx
0040105A mov edx,dword ptr [ecx] //取值 ecx存在要取的值的地址
0040105C push edx
0040105D mov eax,dword ptr [ebp-0Ch]
00401060 mov ecx,dword ptr [eax]
00401062 push ecx
00401063 push offset string "%d,%d\n" (0042201c)
00401068 call printf (004010a0)
0040106D add esp,0Ch
12: }
00401070 pop edi //恢复现场
00401071 pop esi
00401072 pop ebx
00401073 add esp,50h
00401076 cmp ebp,esp
00401078 call __chkesp (00401120)
0040107D mov esp,ebp
0040107F pop ebp
00401080 ret