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