指针(类型+地址)
指针就是类型+地址


指针=(int*)进程的虚拟地址 这里的int*表示强制转换整数为int虚拟内存地址的常量指针
在c语言中,为了表示指针变量和它所指向变量之间的联系,用“*”表示指向。
例如:
int i,*ptr1;
ptr1=&i;
*ptr1=100;/*把100存入ptr所指向的变量i中*/
等同于:i=100;
又如:
char ch,*ptr2;
ptr2=&ch;
*ptr2+=32;/*把ptr2所指向变量ch中的值加32*/
相当于:ch+=32;
ch=*ptr2;相当于:ch=i;
应当注意的是,在变量声明中的“*”和表达式中的“*”意义是不一样的,变量声明中的“*”意味着定义一个存放指针的指针变量,而表达式中的“*”表示间接存取指针变量里的指针所指向变量的值。在编程序是经常用到。
mov 的第 1 操作数表示传输“源”,第 2 操作数表示传输“目标”。例如“mov 内存 , 寄存
器”表示将内存中的值加载到寄存器。
实际在编写指令时,还需要根据所传输的数据的大小添加助记符后缀。例如将 32 位宽的立
即数 105000 加载到 eax 寄存器时,要加上后缀 l,写成下面这样。
movl $105000, %eax
将寄存器 ecx 中的值转移到 eax 寄存器的写法如下所示。
movl %ecx, %eax
最后,将 ecx 寄存器中的数据作为地址访问内存,并将内存上的数据加载到 eax 寄存器中
的写法如下所示。
movl (%ecx), %eax
不习惯汇编的话会觉得 %ecx 和 (%ecx) 的区别难以理解,可以把它当作 C 语言的指针。
指针变量 ptr 自身的值等同于 %ecx 的话,那么对指针的取值操作 *ptr 就相当于 (%ecx)。
另外,%ecx 是访问寄存器,而 (%ecx) 则是利用寄存器访问内存。
C 语言的指针就是保存虚拟地址的数据类型。例如将整数 15000 强制转换为 char* 类型并
访问,就能够得到该进程的地址空间中 15000 地址上的值。
如果下面出现b = a;那么它就会根据符号表找到变量的真正的物理位置,取得它的值,赋给b。
我们再定义一个变量 a 时,变量 a 本质上代表一个存储单元,CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。
