- 论坛徽章:
- 0
|
通过下面简单的几行c代码及其对应的汇编代码,换个角度看看c语言中的指针和&操作符:
- int main(void)
- {
- int *x;
- int a;
- a = 10;
- x = &a;
- *x = 11;
- }
复制代码
对应的汇编代码如下:
- /*********************************************************************************
- * 1:ebp寄存器入栈
- 2:esp保存到ebp寄存器中,访问栈中的局部变量通过ebp寄存器来操作
- 3:在栈中开辟空间,保存局部变量。
- 4:将数值10保存到变量a中,即存储单元(ebp - 8)对应的就是变量a,从这里可以看出,
- 变量a的地址就是(ebp - 8)
- 5:leal指令为取有效地址,而不需要访问相应的存储单元。结合上面第4行指令,
- 此时,eax寄存器保存的就是变量a的地址,即(ebp - 8)
- 6:(ebp - 4)为指针变量x的地址,即存储单元(ebp - 4)对应的就是指针变量x,
- 此时将eax寄存器的值保存到存储单元(ebp - 4)中,也就是将变量a的地址保存到
- 指针变量x中,从这里可以看出,&操作符可以用leal指令来实现
- 7:访问存储单元(ebp - 4),将里面的值保存到eax寄存器中,即eax寄存器中的值
- 为变量a的地址,即(ebp - 8)
- 8:对存储单元(ebp - 8)进行访问,将11保存到该存储单元中,即将数值11保存到
- 变量a中
- ****************************************/
- 1:pushl %ebp
- 2:movl %esp, %ebp
- 3:subl $16, %esp
- 4:movl $10, -8(%ebp)
- 5:leal -8(%ebp), %eax
- 6:movl %eax, -4(%ebp)
- 7:movl -4(%ebp), %eax
- 8:movl $11, (%eax)
复制代码
栈的大概布局如下:
- ***************** 用户栈栈顶部 高地址方向
- * *
- * *
- * *
- * *
- *---------------*
- * ebp *
- *---------------* 第1,2,3行指令执行后,esp_old,ebp指向此处。
- * x,值为ebp-8 *
- * --------------* ebp - 4,该位置为指针变量x的地址,该存储单元对应的就是指针变量x
- * a,值为10 *
- *---------------* ebp - 8,该位置为变量a的地址,该存储单元对应的就是变量a
- * *
- *---------------*
- * *
- *---------------* esp=(esp_old - 16),第3行指令执行后,esp指向此处。
- * *
- * *
- * *
- * *
- * *
- * *
- * *
- * *
- * *
- * *
- * *
- * *
复制代码
|
|