gpt4 book ai didi

c - 程序集如何访问/存储堆栈上的变量

转载 作者:太空狗 更新时间:2023-10-29 16:01:46 24 4
gpt4 key购买 nike

在汇编中您可以将数据存储在寄存器或堆栈中。在任何给定时刻只能访问堆栈的顶部(对吗?)。考虑以下 C 代码:

main(){
int x=2;
func();
}

func( int x ){
int i;
char a;
}

调用 func() 后,以下内容被压入堆栈(考虑 32 位系统):

variable x (4 bytes, pushed by main)
<RETURN ADDRESS> (4 bytes pushed by main?)
<BASE POINTER> (4 bytes pushed by func())
variable i (4 bytes, pushed by func())
variable a (1 byte, pushed by func())

我有以下问题:

  1. 在 C 代码中,您可以从函数内的任何位置访问局部变量,但在汇编中,您只能访问堆栈的顶部。 C代码被翻译成汇编(在机器代码中,但汇编是它的可读形式)。那么汇编如何支持读取不在栈顶的变量呢?

  2. 在我的示例中,我是否遗漏了任何也会被压入堆栈的内容?

  3. 在汇编中,如果您将一个 char 压入堆栈或将一个 int 压入堆栈,它如何确定它需要压入 4 个字节还是 1 个字节?因为它使用相同的操作(推送)对吗?

提前致谢克。马里克鲁兹

最佳答案

函数开头的堆栈指针被放入一个寄存器中,然后通过这个基地址加上变量的偏移量来访问变量/参数。

如果您想查看代码,而不是创建目标文件,让编译器停止创建汇编文件。然后你就可以确切地看到它是如何工作的。 (当然,这需要您拥有一个有效的 C 程序,这与您现在在问题中拥有的程序不同。)

关于c - 程序集如何访问/存储堆栈上的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22091434/

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