问题标签 [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.
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。这很奇怪,因为它使查找在线教程变得更加困难。
assembly - gcc 不会移动 esp 寄存器来为局部变量分配内存(x86_64)
我有以下功能:
gcc -S file.c 给出了这样的汇编代码:
正如我们所见,变量a、b和c存储在 RSP 寄存器指向的位置下方的内存中。
它是如何工作的?为什么 gcc 不从 esp 中减去所需的内存空间?如果我想使用内联汇编代码并在那里使用指令“push”怎么办?它会覆盖局部变量吗?
c - 为什么 gcc 使用堆栈区域而不递减堆栈指针?
对于这个简单的 C 程序,
gcc 10 生成以下汇编代码(使用https://godbolt.org/并在我的机器上验证):
如您所见,gcc 正在使用堆栈区域而不递减堆栈指针。这是正常的吗?gcc 不应该在使用堆栈区域之前减少 esp 吗?
c - 为什么堆栈指针 %rsp 在使用之前不(总是)增长?
我写了一个小示例程序来玩:
在 x86-64 上编译:
并查看了反汇编f()
:
让我有点失望的是它正在写入%rbp-0x4
,此时%rbp
等于%rsp
。这意味着我们在堆栈顶部之外写入 4 个字节。我明白为什么这样做完全没问题,因为f()
不调用任何东西,所以堆栈永远不会在这里意外增长。但是感觉还是有点奇怪。sub 0x4, %rsp
这是保存和add 0x4, %rsp
指令的某种优化吗?
编译gcc (GCC) 4.8.5
assembly - 跳转到新函数后 rbp 的值发生变化
我有以下汇编程序:
单步执行程序时,在尝试访问 的值call func
之前,之前是 $0x0800001e`(8 字节,0 字节,0 字节,30 字节),现在显示全零:push %rbp
rbp
为什么会出现这种情况?是否rbp
在函数调用之间重置其值(尽管保留其地址)?
c - 了解具有多个函数调用的函数序言
让我们以我从单个函数中获得的以下示例为例:
如果我们查看 之前的堆栈...
,它会给我们:
或者对我来说,一种更简单的可视化方法是:
那么我的问题是子函数调用(例如,如果我在该...
部分中调用另一个函数调用)可能会破坏我在上面添加的所有两个变量(2
和4
)吗?
c - 返回结构时的奇怪编译器行为
我是 C 和汇编代码的新手,只是一个关于返回结构的问题,下面是我的代码
以下是我的问题:
Q1-您可以看到在foo
方法的堆栈中,它似乎为foo_a
. 对于大多数函数,gcc 通常在ret
like之前释放堆栈
ret
但是in指令之前没有释放堆栈指令foo
,这是为什么呢?编译器是否故意这样做,因为如果它释放堆栈foo
然后我们无法将结构返回给函数?如果是为了这个目的,那我就可以理解为什么在foo
.
Q2-似乎foo_a
堆栈上的内部结构3|2|1
不是1|2|3
,为什么编译器会以错误的方式做事?
Q3-为什么movl $3, %edx
在foo
方法中?不应该movl $3, -12(%rsp)
吗?这可能是我没有参考的原因foo_a.z
之一main
,但我也没有参考foo_a.y
,main
指令仍然是movl $2, -16(%rsp)
assembly - 为什么 gcc 程序集不减去 rsp?
在探索Godbolt时,我注意到 gcc 几乎从不减去rsp
. 例如:
为什么?不应该sub rsp, 4
在堆栈上分配一个整数吗?
assembly - x86-64 gcc 没有为局部变量分配堆栈帧
我在学习汇编代码时遇到了一些问题。
我使用“编译器资源管理器”,这是一个支持大量编译器的网站。
我做了一个简单的代码并将其编译为 x86-64 gcc。
<C++ 代码>:
:
总和(整数,整数):
主要的:
据我所知,堆栈在 x86 中呈现局部变量和保存返回地址等。
我看不到任何关于“sub rsp,??”的内容 在功能序言中。而且我看不到“添加rsp,??” 在功能结语中也是如此。
c++ - pop rbp 后存储在 [rbp-1] 中的值会发生什么变化
我是汇编的新手,我通过将c
代码编译为汇编来学习汇编。
对于此c++
代码
这是生成的汇编代码(英特尔语法)
在本指令中
我们存储1
在堆栈中,它的地址是 [rbp - 1]
在这里,我们将返回值设置为1
和popping
堆栈并将其值存储在rbp
.
我的疑问是我们如何存储1
在地址中,[rbp - 1]
因为rsp
应该总是指向堆栈的顶部(在这种情况下是向下),在这条指令之后mov BYTE PTR [rbp-1], 1
,顶部应该是[rbp-1]
但rsp
仍然指向rbp
.
是不是正确的代码应该是这样的
这样,rsp 将始终指向顶部。
[rbp-1]
我的第二个疑问是after中存储的值会发生什么ret
。它是否会以某种方式自动清理。