问题标签 [red-zone]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
162 浏览

c - gcc如何为堆栈分配内存的不同方式

gcc 如何决定为堆栈分配多少内存,为什么当我printf()从 main 中删除(或任何函数调用)时它不再减少 %rsp?

1.当我使用代码示例时,我注意到:https : 6th line//godbolt.org/z/fQqkNEsubq $48, %rsp如果我printf()从我的C代码中删除line 22. 看起来当我没有从我的 main 中进行任何函数调用时,%rsp它不会递减,但数据仍然会根据%rbp偏移量分配。我认为%rsp只有在堆栈增长时才会改变。我的理论是,由于它不会进行任何其他函数调用,它知道它不需要为其他不存在的函数保留堆栈。%rsp但是随着数据的保存,不应该继续增长吗?

2.向 my 中添加变量时rect struct,我还注意到它有时会以大于添加的数据类型大小的步长分配内存。在决定分配多少内存给堆栈时遵循什么约定?

3.有没有在线工具可以将汇编代码作为输入,然后绘制堆栈图像并告诉我每个寄存器在任何执行点的状态?Godbolt.org 是一个非常好的工具,我只希望它有这两个额外的功能。

我将粘贴下面的代码,以防将来godbolt的链接停止工作:

PS:我遵循的书使用 AT&T 语法来教授 x86。这很奇怪,因为它使查找在线教程变得更加困难。

0 投票
0 回答
30 浏览

assembly - gcc 不会移动 esp 寄存器来为局部变量分配内存(x86_64)

我有以下功能:

gcc -S file.c 给出了这样的汇编代码:

正如我们所见,变量abc存储在 RSP 寄存器指向的位置下方的内存中。

它是如何工作的?为什么 gcc 不从 esp 中减去所需的内存空间?如果我想使用内联汇编代码并在那里使用指令“push”怎么办?它会覆盖局部变量吗?

0 投票
0 回答
46 浏览

c - 为什么 gcc 使用堆栈区域而不递减堆栈指针?

对于这个简单的 C 程序,

gcc 10 生成以下汇编代码(使用https://godbolt.org/并在我的机器上验证):

如您所见,gcc 正在使用堆栈区域而不递减堆栈指针。这是正常的吗?gcc 不应该在使用堆栈区域之前减少 esp 吗?

0 投票
0 回答
82 浏览

c - 为什么堆栈指针 %rsp 在使用之前不(总是)增长?

我写了一个小示例程序来玩:

在 x86-64 上编译:

并查看了反汇编f()

让我有点失望的是它正在写入%rbp-0x4,此时%rbp等于%rsp。这意味着我们在堆栈顶部之外写入 4 个字节。我明白为什么这样做完全没问题,因为f()不调用任何东西,所以堆栈永远不会在这里意外增长。但是感觉还是有点奇怪。sub 0x4, %rsp这是保存和add 0x4, %rsp指令的某种优化吗?

编译gcc (GCC) 4.8.5

0 投票
1 回答
228 浏览

assembly - 跳转到新函数后 rbp 的值发生变化

我有以下汇编程序:

单步执行程序时,在尝试访问 的值call func之前,之前是 $0x0800001e`(8 字节,0 字节,0 字节,30 字节),现在显示全零:push %rbprbp

为什么会出现这种情况?是否rbp在函数调用之间重置其值(尽管保留其地址)?

0 投票
0 回答
46 浏览

c - 了解具有多个函数调用的函数序言

让我们以我从单个函数中获得的以下示例为例:

如果我们查看 之前的堆栈...,它会给我们:

或者对我来说,一种更简单的可视化方法是:

那么我的问题是子函数调用(例如,如果我在该...部分中调用另一个函数调用)可能会破坏我在上面添加的所有两个变量(24)吗?

0 投票
0 回答
44 浏览

c - 返回结构时的奇怪编译器行为

我是 C 和汇编代码的新手,只是一个关于返回结构的问题,下面是我的代码

以下是我的问题:

Q1-您可以看到在foo方法的堆栈中,它似乎为foo_a. 对于大多数函数,gcc 通常在retlike之前释放堆栈

ret但是in指令之前没有释放堆栈指令foo,这是为什么呢?编译器是否故意这样做,因为如果它释放堆栈foo然后我们无法将结构返回给函数?如果是为了这个目的,那我就可以理解为什么在foo.

Q2-似乎foo_a 堆栈上的内部结构3|2|1不是1|2|3,为什么编译器会以错误的方式做事?

Q3-为什么movl $3, %edxfoo方法中?不应该movl $3, -12(%rsp)吗?这可能是我没有参考的原因foo_a.z之一main,但我也没有参考foo_a.ymain指令仍然是movl $2, -16(%rsp)

0 投票
0 回答
57 浏览

assembly - 为什么 gcc 程序集不减去 rsp?

在探索Godbolt时,我注意到 gcc 几乎从不减去rsp. 例如:

为什么?不应该sub rsp, 4在堆栈上分配一个整数吗?

0 投票
0 回答
45 浏览

assembly - x86-64 gcc 没有为局部变量分配堆栈帧

我在学习汇编代码时遇到了一些问题。

我使用“编译器资源管理器”,这是一个支持大量编译器的网站。

我做了一个简单的代码并将其编译为 x86-64 gcc。

<C++ 代码>:

总和(整数,整数):

主要的:

据我所知,堆栈在 x86 中呈现局部变量和保存返回地址等。

我看不到任何关于“sub rsp,??”的内容 在功能序言中。而且我看不到“添加rsp,??” 在功能结语中也是如此。

0 投票
0 回答
114 浏览

c++ - pop rbp 后存储在 [rbp-1] 中的值会发生什么变化

我是汇编的新手,我通过将c代码编译为汇编来学习汇编。

对于此c++代码

这是生成的汇编代码(英特尔语法)

您可以在此处查看编译器资源管理器链接

在本指令中

我们存储1在堆栈中,它的地址是 [rbp - 1]

在这里,我们将返回值设置为1popping堆栈并将其值存储在rbp.

我的疑问是我们如何存储1在地址中,[rbp - 1]因为rsp应该总是指向堆栈的顶部(在这种情况下是向下),在这条指令之后mov BYTE PTR [rbp-1], 1,顶部应该是[rbp-1]rsp仍然指向rbp.

是不是正确的代码应该是这样的

这样,rsp 将始终指向顶部。

[rbp-1]我的第二个疑问是after中存储的值会发生什么ret。它是否会以某种方式自动清理。