【发布时间】:2015-07-01 01:26:27
【问题描述】:
我正在阅读我的教科书,里面有交换函数的代码:
在 C 中:
int exchange(int *xp, int y) {
int x = *xp;
*xp = y;
return x;
}
在带有注释的 x86 汇编中:
// xp is at %ebp + 8, y at %ebp + 12
movl 8(%ebp), %edx // get xp
movl (%edx), %eax // get x at xp
movl 12(%ebp), %ecx // get y
movl %ecx, (%edx) // store y at xp
所以根据我的理解,如果 int* xp 指向地址 A 处的 int I,则汇编代码的第一行将 A 存储在 %edx。然后它在第二行被取消引用并存储在 %eax。
如果这是真的,我想知道为什么第 1 行的“8(%ebp)”没有取消引用指针,而是将 int I 存储在 %edx 而不是地址 A 中?这不是括号在汇编中的作用吗?
或者这是否意味着当指针被压入堆栈时,指针的地址被压入而不是它所持有的值,因此 8(%ebp) 在技术上持有 &xp?
只是想澄清一下我的理解是否正确。
【问题讨论】:
-
Ebp 是堆栈帧的地址,所有参数都在其中。 Ebp+8 是 xp 值的地址(即 int 的地址)。从技术上讲,是的——ebp+8 == &xp。
-
这是否意味着当指针被压入堆栈时,指针的地址被压入而不是它所持有的值 – 不,指针值被压入在堆栈上。
标签: c pointers assembly x86 att