Cha*_*Liu 7 c x86 assembly pointers att
我正在读我的教科书,它有交换功能的代码:
在C:
int exchange(int *xp, int y) {
int x = *xp;
*xp = y;
return x;
}
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
因此,根据我的理解,如果int*xp指向地址A处的int I,则汇编代码的第一行将A存储在%edx处.然后在第二行中取消引用并存储在%eax中.
如果这是真的,我想知道为什么第1行的"8(%ebp)"没有取消引用指针,将int存储在%edx而不是地址A中?这不是括号在汇编中做的吗?
或者这是否意味着当指针被推入堆栈时,指针的地址被推上而不是它所持有的值,因此8(%ebp)技术上持有&xp?
只是想澄清我的理解是否正确.
xp是一个指针.它有一个四字节值.该值由调用函数压入堆栈.您未显示的函数序言设置了一个基本指针ebp.值xp存储在相对于该基指针的偏移量8处.
这样的代码的第一行取消引用基址指针,由括号所指示的,为8的偏移量来检索值的xp(这是一个指向一个int的地址),并将其放入edx.
第二行代码使用地址edx来检索值的值int,并将该值放入eax.请注意,函数返回值将是值eax.
第三行取消引用基指针,偏移量为12,得到值y.
第四行使用地址edx放置y在xp指向的位置.
| 归档时间: |
|
| 查看次数: |
10373 次 |
| 最近记录: |