gpt4 book ai didi

c - x86 汇编代码中的指针引用

转载 作者:太空狗 更新时间:2023-10-29 17:10:31 27 4
gpt4 key购买 nike

我正在阅读我的教科书,它有交换函数的代码:

在 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?

只是想澄清一下我的理解是否正确。

最佳答案

xp 是一个指针。它有一个四字节的值。该值被调用函数压入堆栈。您没有显示的函数序言在 ebp 中设置了一个基指针。 xp 的值存储在相对于该基指针的偏移量 8 处。

因此第一行代码取消引用基指针,如括号所示,偏移量为 8 以检索 xp(这是一个地址指向一个 int) 并将其放入 edx

第二行代码使用 edx 中的地址来检索 int 的值,并将该值放入 eax 中。请注意,函数返回值将是 eax 中的值。

第三行取消引用基指针,偏移量为 12,以获得 y 的值。

第四行使用edx中的地址将y放在xp指向的位置。

关于c - x86 汇编代码中的指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29813643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com