相关疑难解决方法(0)

EBP帧指针寄存器的用途是什么?

我是汇编语言的初学者,并注意到编译器发出的x86代码通常在释放/优化模式下保持帧指针,当它可以使用EBP寄存器时.

我理解为什么帧指针可能使代码更容易调试,并且如果alloca()在函数内调用则可能是必要的.但是,x86只有很少的寄存器,并使用其中两个寄存器来保存堆栈帧的位置,当一个就足够了,对我来说没有意义.为什么即使在优化/发布版本中省略框架指针也是一个坏主意?

performance x86 assembly

87
推荐指数
3
解决办法
5万
查看次数

试图理解gcc选项-fomit-frame-pointer

我让Google告诉我该gcc选项的含义-fomit-frame-pointer,它将我重定向到以下声明.

-fomit帧指针

不要将帧指针保存在寄存器中以查找不需要的函数.这避免了保存,设置和恢复帧指针的指令; 它还在许多功能中提供额外的寄存器.它还使某些机器无法进行调试.

根据我对每个函数的了解,将在进程内存的堆栈中创建激活记录,以保留所有局部变量和更多信息.我希望这个帧指针意味着一个函数的激活记录的地址.

在这种情况下,什么是函数类型,它不需要将帧指针保持在寄存器中?如果我得到这个信息,我会尝试设计基于它的新函数(如果可能),因为如果帧指针没有保存在寄存器中,一些指令将在二进制中省略.在具有许多功能的应用程序中,这将显着提高性能.

c optimization performance gcc

74
推荐指数
3
解决办法
5万
查看次数

任何语言/编译器都使用非零嵌套级别的x86 ENTER指令吗?

那些熟悉x86汇编编程的人非常习惯于典型的函数序言/结语:

push ebp ; Save old frame pointer.
mov  ebp, esp ; Point frame pointer to top-of-stack.
sub  esp, [size of local variables]
...
mov  esp, ebp ; Restore frame pointer and remove stack space for locals.
pop  ebp
ret
Run Code Online (Sandbox Code Playgroud)

也可以使用ENTERLEAVE指令实现相同的代码序列:

enter [size of local variables], 0
...
leave
ret
Run Code Online (Sandbox Code Playgroud)

所述ENTER指令的第二操作数是嵌套级别,它允许从被调用函数访问的多个父帧.

这不在C中使用,因为没有嵌套函数; 局部变量只有它们声明的函数的范围.这个构造不存在(虽然有时我希望它这样做):

void func_a(void)
{
    int a1 = 7;

    void func_b(void)
    {
        printf("a1 = %d\n", a1);  /* a1 inherited from func_a() …
Run Code Online (Sandbox Code Playgroud)

x86 assembly

44
推荐指数
3
解决办法
6688
查看次数

EBP寄存器(基帧指针)仅适用于x86中的调试吗?

学习x86程序集和框架指针让我大吃一惊.我从这个问题中了解到,EBP使调试生活变得非常棒.这很好,但我很好奇,"EBP还用了什么呢?" 查看调用堆栈维基百科文章,EBP是动态堆栈分配所必需的.

因为我一直假设动态分配在堆上.那么,为什么我要使用动态堆栈分配 - 为什么堆不够好呢?而且,EBP如何对此有用?

debugging x86 assembly memory-management

15
推荐指数
2
解决办法
8620
查看次数

与push一样的指令序列

我想知道是否有可能(如果是这样,如何)编写一系列具有相同效果的指令push.例如,如果内容ax是1200,我做了push ax,我还可以用什么其他指令来完成什么push ax呢?

x86 assembly stack x86-16

4
推荐指数
1
解决办法
1156
查看次数

使用带参数的函数在堆栈中ebp和esp的行为

我想了解有关堆栈的更多信息。特别是调用带有参数的函数时会发生什么。为此,我编写以下代码:

    #include <stdio.h>
    int sum(int d, int e, int f){
        int result = d + e + f;
        return result;
    }

   int main(void){
   int a = 5;
   int b = 4;
   int c = 2;

   int erg = sum(a,b,c);
   printf("Result is: %d", erg);

   }
Run Code Online (Sandbox Code Playgroud)

我得到以下汇编代码(我将仅添加main函数的一部分,因为首先我想了解本节):

    push ebp,
    mov ebp, esp
    and esp, -16
    sub esp, 32
    mov DWORD PTR[esp+28], 5
    mov DWORD PTR[esp+24], 4
    mov DWORD PTR[esp+20], 2
    mov eax, DWORD PTR[esp+20]
    mov DWORD PTR[esp+8], eax
    mov eax, …
Run Code Online (Sandbox Code Playgroud)

parameters x86 assembly stack calling-convention

2
推荐指数
1
解决办法
4855
查看次数