变量是指一块内存,这句话怎么理解?
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的操作也是对该地址的操作;