一段简单程序从汇编看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

12.3 C语言指针的简单示例

前边我们提到了,指针的意义往往在小程序里是体现不出来的,对于简单程序来说,有时候用了指针,反而可能比没用指针还麻烦,但是为了让大家巩固一下指针的用法,我还是写了个使用指针的流水灯程序,目的是让大家从简...
  • softn
  • softn
  • 2016年07月07日 05:55
  • 499

从汇编语言的角度看清数组名和指针变量的区别

当初学c语言总感觉数组名和指针之间有种说不清道不明的关系,两者很像,但是又有着解释不清的区别。 数组名和指针的区别 用常量初始化字符数组和指针变量...
  • lyh__521
  • lyh__521
  • 2015年11月27日 14:30
  • 1553

从汇编角度分析C语言的本质(一)

其实,本人学c语言不算很久,也没有那些大神随便几万行代码的经验,说白了,其实就一个入门的 菜鸟。 但是,从迷迷茫茫的开始接触c语言到现在自认为对c语言有半点见解,感觉某些经验,思考过程还是很有记录的意...
  • daxiejianghu
  • daxiejianghu
  • 2013年08月06日 16:47
  • 887

C语言 用汇编来看看变量和指针实现

Makefile print:aa ./aa aa: aa.o gcc -g -o aa aa.o ...
  • coolgw2015
  • coolgw2015
  • 2015年08月07日 20:27
  • 736

汇编语言的寻址方式与C语言中的指针是一个东西。

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 汇编语言的寻址方式与C语言中的指针是类似的! 汇编语言的寻址方式与C语言中...
  • yushaopu
  • yushaopu
  • 2016年08月24日 13:56
  • 1350

一段简单汇编语言程序及说明

assume cs:codesg   codesg segment       mov ax,0123h       mov bx,0456h       add ax,b...
  • huangyuan_xuan
  • huangyuan_xuan
  • 2014年11月09日 13:06
  • 1736

C指针原理(27)-汇编分析C指针机制

char*与char[]-从编译后的汇编代码分析 节 含义 .text 已编译程序的机器代码 .rodata 只读数据,如pintf和switch语句中的字符串和常量值 .dat...
  • u010255642
  • u010255642
  • 2013年12月06日 15:33
  • 1494

用汇编的眼光看C++(之指针1)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】       指针是我们在C/C++中经常遇到的一种数据类型。指针用的好,可以提高代码的可读...
  • feixiaoxing
  • feixiaoxing
  • 2011年09月07日 20:30
  • 9127

从汇编和高级语言的角度理解传值方式,传值,传引用,传指针的本质机制与区别。白话通俗易懂。

函数的传参与返回值的方式有传值和传递引用,c语言中就是传值,而c++扩展传引用。 而传值分为传递值(实参的值,此时形参是实参在内存中的一份拷贝,形参在使用时分配内存,结束时释放,实参和形参在内存中的...
  • shiyuqing1207
  • shiyuqing1207
  • 2015年05月23日 21:22
  • 783

从简单程序看java运行错误

问HelloWorld问题的人实在是太多了,而且经常都以“问一个最简单的问题”开头。其实回想一下,自己也是从这个阶段过来的,说一句“你好”,真的是一个最简单的问题吗?首先,我们要假设一下我们的平台...
  • alex197963
  • alex197963
  • 2007年04月22日 19:14
  • 512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一段简单程序从汇编看C指针
举报原因:
原因补充:

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