assembly - 当我向汇编 x86 插入新指令时堆栈帧大小?

标签 assembly x86 gnu fedora stack-frame

如果我在堆栈帧内插入新的函数和指令来汇编 x86 代码,是否需要增加堆栈大小?如果是的话,是多少?

sub 0x4, %esp
push %eax                 ;;new instruction
...
call  fun                 ;; new inserted function
pop  %eax                 ;;new instruction 
.....
add 0x4, %esp

最佳答案

Calling Conventions是管理如何调用函数、传递和返回值以及如何管理堆栈空间和可用寄存器的关键。有很多约定。知道你的函数正在使用哪一个,以及你正在调用的函数使用哪一个;他们可能会有所不同!

一个非常常见的约定是“管理自己的堆栈”。在这种情况下,每个函数都会在堆栈上分配其所需的堆栈空间量。它不需要担心它调用的函数的堆栈空间需求;根据定义,它们将分配所需的(额外)堆栈空间量。

“叶子”函数是不调用其他函数的函数;每个叶函数都需要一定量的堆栈空间。某些调用约定要求叶函数的调用者不仅为其自己的需要分配空间,而且还为其调用的所有叶函数分配空间。这可以将调用叶函数(调用次数最多!)的开销降至最低。通常这种安排只能由编译器完成,因为人们很难可靠地跟踪他们调用的所有函数以及这些函数的堆栈需求。有时,您可能会遇到手写的汇编函数,该函数在其 API 中声明调用者必须为其分配空间。

System V ABI 在 SP 下方提供了约 128 字节堆栈的“红色区域”,这些堆栈始终可供叶函数使用。这意味着调用者不需要分配该空间,并且小于红色区域大小需求的叶函数只需使其可用而无需分配它。这是一个非常好的约定,因为没有函数不必担心它是否正在调用叶函数,并且这使得可以将任意例程集链接在一起。

关于assembly - 当我向汇编 x86 插入新指令时堆栈帧大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791255/

相关文章:

c - 打印消息内联汇编

c - 在内存中(在后台)创建结构体时的操作顺序是什么?

c - GCC Optimization 删除了函数 Prologue 和 Epilogue

c - 在 C 中包装 alloca 函数

c - 分区例程

assembly - MASM shellcode 和 NASM shellcode 之间有区别吗

assembly - 什么是段落(当提到内存时)

java - 签名的 Android APK 文件是否可以在 x86 和 ARM-Android 设备上运行?

c++ - AVX2 列总体计数算法分别针对每个位列

build - 并行 GNU Make 为 Antlr 解析器生成文件多次运行命令