临时数据如何存储在堆栈帧上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了临时数据如何存储在堆栈帧上相关的知识,希望对你有一定的参考价值。

Int test(){
    char buff[10]

    printf("Enter text: ");

    gets(buff);

    puts(buff);
}

我不知道如何表达这个问题,但我试图理解如何将值存储在堆栈帧上为局部变量分配的缓冲区上。

---------------
Return Address
---------------
old ebp
---------------
local variables
--------------- 

每个块是4个字节还是4个1字节?

------------------
 00 | 40 | 06 | 06
------------------
 ff | ff | de | 70 
------------------

通过gdb我看到为测试分配的缓冲区是0x10

我进入了sssssssss

x/x $rbp = 0xffffde70
x/x $rbp + 8 = 0x00400606
x/s $rbp - 16 = "sssssssss"
x/s $rbp - 8 = "
s"
x/s $rbp - 4 = ""

那么我输入的字符(十六进制)是如何存储的?喜欢每个街区有多少。这是一个64系统。

 -----------------
 00 | 40 | 06 | 06
------------------
 ff | ff | de | 70 
------------------
    |    |    | 
------------------
    |    |    | s
------------------
 s  | s  | s  | s
------------------
 s  | s  | s  | s 
------------------
答案

从严格的C角度来看,我们不知道。

标准没有规定这样的事情。该标准甚至没有提到堆栈的概念。从标准的角度来看,代码是在抽象机器上执行的(即没有描述机器是如何做到的。只有机器必须做什么)。

所以如何完成取决于具体的实现,它(可能)因系统而异。

您需要找到您正在使用的系统的ABI文档。 ABI文档将描述如何在您的系统上完成它。

请参阅en.wikipedia.org/wiki/Application_binary_interface

也许读Where is the x86-64 System V ABI documented?

以上是关于临时数据如何存储在堆栈帧上的主要内容,如果未能解决你的问题,请参考以下文章

Scala:如何在循环中组合数据帧

Buffer lab——20145326蔡馨熠

为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?

如何将数据帧传递到气流任务的临时表中

异常帧与返回堆栈上的其他数据有何区别?

在恢复C#异步方法时,System.Diagnostics.StackTrace中缺少Visual Studio 2017调用堆栈中可见的堆栈帧