Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 向程序集x86插入新指令时的堆栈帧大小?_Assembly_X86_Gnu_Fedora_Stack Frame - Fatal编程技术网

Assembly 向程序集x86插入新指令时的堆栈帧大小?

Assembly 向程序集x86插入新指令时的堆栈帧大小?,assembly,x86,gnu,fedora,stack-frame,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 是管理如何调用函数、传递和返回值以及如何管理

如果我在堆栈框架内插入新的函数和指令来组装x86代码,是否有必要增加堆栈大小?如果是的话,多少钱

sub 0x4, %esp
push %eax                 ;;new instruction
...
call  fun                 ;; new inserted function
pop  %eax                 ;;new instruction 
.....
add 0x4, %esp
是管理如何调用函数、传递和返回值以及如何管理堆栈空间和可用寄存器的关键。有很多惯例。知道您的函数正在使用哪一个,以及您调用的函数正在使用哪一个;他们可能不一样

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

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


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

我如何知道我的函数使用的约定?此外,我使用Linux fedora 9。实际上,我正在编写一个SPEC基准测试程序的汇编代码,我需要通过插入新函数和新指令来修改代码。您可以仔细阅读编译器文档。我想维基百科链接可能会告诉你,因为你正在运行Linux。@hamb,这个链接可能也会有帮助。这里详细描述了各种调用约定以及其他寄存器和堆栈相关约定。