- 1 0x08048394 <+0>: push %ebp
-
2 0x08048395 <+1>: mov %esp,%ebp
-
3 0x08048397 <+3>: sub $0x20,%esp
- /*
- 第4行至第7行对应C代码int array[4] = {0};
- 这里说明数组只是一个同类型变量的内存空间的集合。
- 对应这个例子,在栈上申请了4个整形变量的空间。
- */
-
4 0x0804839a <+6>: movl $0x0,-0x14(%ebp)
-
5 0x080483a1 <+13>: movl $0x0,-0x10(%ebp)
-
6 0x080483a8 <+20>: movl $0x0,-0xc(%ebp)
-
7 0x080483af <+27>: movl $0x0,-0x8(%ebp)
- /*
- 第8行对应int *point = NULL;
- 这里说明指针本身自己也是一个变量,同样占用了栈的空间。
- 在这处要对比数组的处理,数组的占用的空间实际上是数组中的元素所占用的。
- 在本例中,即array[0],array[1],array[2],array[3],而array本身实际上更像一个label。
- */
-
8 0x080483b6 <+34>: movl $0x0,-0x18(%ebp)
- // 第9行对应int value = 0;
-
9 0x080483bd <+41>: movl $0x0,-0x4(%ebp)
- /*
- 10~11行,对应代码value = array
- 因为array只是一个数组的名称,所以value = array就是将array数组的首元素的地址赋给value。
- 这个应该就是C标准的一个规则。这也是最合理的行为,因为如果不是取array数组的首地址,其它的行为更加没有意 义。
- */
-
10 0x080483c4 <+48>: lea -0x14(%ebp),%eax
-
11 0x080483c7 <+51>: mov %eax,-0x4(%ebp)
- /*
- 12~13行,对应代码value = &array
- 从C语言的语义上看,就是取array的地址。
- 从汇编上看,也是取array数组的首元素的地址。
- */
-
12 0x080483ca <+54>: lea -0x14(%ebp),%eax
-
13 0x080483cd <+57>: mov %eax,-0x4(%ebp)
- /*
- 14~15行, 对应代码value = array[0]
- 这里与上文不同,取数组的内容赋给value
- */
-
14 0x080483d0 <+60>: mov -0x14(%ebp),%eax
-
15 0x080483d3 <+63>: mov %eax,-0x4(%ebp)
- /*
- 16~17行,对应代码value = &array[0]
- 很明显,取array[0]的地址赋给value
- */
-
16 0x080483d6 <+66>: lea -0x14(%ebp),%eax
-
17 0x080483d9 <+69>: mov %eax,-0x4(%ebp)
- /*
- 18~19行,对应代码value = pointer;
- 按照上文的说明,指针本身就是一个变量,所以这里就是将这个变量的值赋给value,即pointer的值赋给value,
- 也就是0.
注意这里与value=array的区别。因为指针本身就是一个变量,所以value = pointer的合理语义就是将pointer的 值赋给value,而array本身并不是一个变量,所以value=array的语义,也是将array的数组首元素的地址赋给value。
- */
-
18 0x080483dc <+72>: mov -0x18(%ebp),%eax
-
19 0x080483df <+75>: mov %eax,-0x4(%ebp)
- /*
- 20~21行,对应代码value = &pointer;
- 取pointer的地址赋给value
- */
-
20 0x080483e2 <+78>: lea -0x18(%ebp),%eax
-
21 0x080483e5 <+81>: mov %eax,-0x4(%ebp)
- /*
- 22~24行,对应代码value = *pointer;
- 取poniter保存的值,将这个值作为一个地址,然后取该地址的值赋给value。
- 在这里,pointer的值是0,所以这句话的语义是从pointer取出它的值0,然后从地址0取值赋给value。
- 当然,如果执行到这里,程序会crash。因为地址0为非法地址。
- */
- 22 0x080483e8 <+84>: mov -0x18(%ebp),%eax
- 23 0x080483eb <+87>: mov (%eax),%eax
- 24 0x080483ed <+89>: %eax,-0x4(%ebp)
-
22 0x080483f0 <+92>: mov $0x0,%eax
-
23 0x080483f5 <+97>: leave
-
24 0x080483f6 <+98>: ret