yigegongjiang / yigegongjiang_discuss

https://www.yigegongjiang.com 评论系统
1 stars 0 forks source link

函数调用栈之彻底理解 | 一个工匠 #10

Open yigegongjiang opened 2 years ago

yigegongjiang commented 2 years ago

https://www.yigegongjiang.com/2022/%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%A0%88%E4%B9%8B%E5%BD%BB%E5%BA%95%E7%90%86%E8%A7%A3/

跋山涉水,走心为匠。而时间,却真的不多了。

liu-paopao commented 1 year ago

这里的栈顶和栈底有没有写反了?好多博客写的rsp指向低地址,称为栈顶,rsp称为栈顶指针。rbp指向栈底,称为栈底指针。

yigegongjiang commented 1 year ago

@liu-paopao 这里的栈顶和栈底有没有写反了?好多博客写的rsp指向低地址,称为栈顶,rsp称为栈顶指针。rbp指向栈底,称为栈底指针。

是的,我写反了,应该是:rbp = 栈底,rsp = 栈顶。 我看了文章其他区块,内容没有偏差,这一块我后面给修正一下。

感谢提醒。

wq24 commented 1 year ago

想问一下为什么主函数栈是以8字节作为一个存储单元,子函数H=函数栈是以4字节为一个存储单元,他们不都是存储int类型吗?

yigegongjiang commented 9 months ago

@wq24 想问一下为什么主函数栈是以8字节作为一个存储单元,子函数H=函数栈是以4字节为一个存储单元,他们不都是存储int类型吗?

Hi,我看了下,没有发现这个问题。如文中这里,可以搜索查阅。int 是 4 个字节偏移的。(如其他位置有,可能是我写错了。不过我目前没有找到。)

0x100003f3f <+15>: movl $0x1, -0x8(%rbp) # 1 值写入变量 a,实际是写到栈内存中 rbp - 8 地址处 0x100003f46 <+22>: movl $0x2, -0xc(%rbp) # 2 值写入变量 b,实际是写到栈内存中 rbp - 12 地址处

对于 int 而言,大小不会因为不同函数栈或者线程发生改变,只和编译平台有关,基本都是 4 字节大小。