关于变量标识和数组标识的地址问题

变量是指一块内存,这句话怎么理解?

void main()
{
  int a= 2;
  int *p = &a;
}

//编译得到
main:
 pushl %ebp
 movl  %esp,%ebp
 subl    $16,%esp
 movl   $2, -8(%ebp)    // int a = 2;
 leal      -8(%ebp), %eax  // int *p = &a;
 movl   %eax,-4(%ebp)
 leave 
 ret

 at&t汇编,源数据在前目标在后。

①在编译后这个‘a’已经不存在,它就是一块内存的地址,所有对‘a’的操作,编译器自动转化为对该地址内数据的操作。如上int a = 2 就是把 2 赋值给 ebp寄存器所存地址-8 这块内存上

②leal就是把ebp寄存器所存地址-8 这个值 赋值给eax寄存器,而不是该寄存器保存的内存地址上保存的值

③指针变量p和a一样,编译后都是一块地址,‘int’、‘*’都是给这个地址做限定

例2

void main()
{
  int temp[] = {1,2};
  int *p = temp;
  int (*m)[] = &temp;
}

编译后获得:
main:
  pushl  %ebp
  movl   %esp,%ebp
  subl     $16,%esp
  movl    $1,-16(%ebp)
  movl    $2,-12(%ebp)  //int temp[] = {1,2};
  leal    -16(%ebp) ,%eax
  movl     %eax,-8(%ebp) // int *p = temp;
  leal    -16(%ebp),%eax
  movl    %eax,-4(%ebp)  // int (*m)[] = &temp;
  leave
  ret

 ①所有对数组变量的操作都是对,数组第一个元素所在地址的操作

 ②对&temp的操作也是对该地址的操作;

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2375023
今日推荐