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

原创 2012年03月29日 18:05:43

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

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

程序分析如下:

#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

相关文章推荐

汇编并分析一段简单C代码

陈可 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000本文会通过分析一个简单C程序的对应...
  • hjvgf
  • hjvgf
  • 2017年02月14日 15:14
  • 187

C指针原理(86)-helloworld的C程序汇编剖析(2)

分析通过GCC编译C语言程序生成的汇编代码,能清楚得了解C语句运行机制、内存分配机制等隐藏在C语言代码下的内部工作原理。下面将对helloworld程序生成的汇编进行分析。 (1)寄存器基础知识   ...

C指针原理(85)-helloworld的C程序汇编剖析(1)

一、汇编基础 1、指令码与数据处理 当计算机处理应用程序运行指令码时,数据指针指示处理器如何在内存的数据区域寻找要处理的数据,这块区域也称为堆栈,指令码放在另外的指令区,此外,还有指令指针机制,当处理...

基于51单片机设计简单计算器,实现6位有效四则运算的程序设计(汇编调用C)

#include #include            #include  #pragma NOREGPARMS          #define a DBYTE[0x30]     ...

反汇编一个简单的C程序

反汇编一个简单的C程序 看了下网易云课堂的《Linux内核分析》,第一节要求有一个简单C程序得到汇编代码,然后分析。只要明确每个汇编指令代表的含义,就可以容易的走下去,关键是要体会里面的思想。 ...

Linux内核分析——反汇编一个简单C程序

Linux内核分析第一周作业,在云课堂的实验楼环境下完成。 Michael O'Connor    原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163...

从C简单程序的汇编代码入手,以理解计算机工作原理。

贺邦  原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000#/info  知识准备 冯诺依...

分析一个简单C程序的汇编代码,理解计算机是如何工作的

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

通过一个简单的C程序汇编代码理解计算机是怎么工作的

刘文-原创作品转载请注明出处 -《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”        经过这一周时间在...

Linux内核分析一:反汇编一个简单的C程序

本博客属于《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000,课程作业。刘洋原创作品,转载请注明出处。  通过分析一个c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一段简单程序从汇编看C指针
举报原因:
原因补充:

(最多只允许输入30个字)