关闭

一段简单程序从汇编看C指针

标签: 汇编cstring工具
355人阅读 评论(0) 收藏 举报
分类:

首先需要明白的两个概念:

    指针:普通变量的地址
    指针变量:该变量内存放的是指针

程序分析如下:

#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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59588次
    • 积分:1206
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:7篇
    • 译文:0篇
    • 评论:24条
    最新评论