相关疑难解决方法(0)

为什么在x86程序集中执行"mov esp,ebp"?

据说该leave指令与以下内容相同:

mov esp,ebp
pop ebp
Run Code Online (Sandbox Code Playgroud)

但这是mov esp,ebp为了什么?这对我来说似乎没有用......

x86 assembly

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

避免gcc功能序幕开销?

我最近遇到了很多函数,其中gcc在x86上生成了非常糟糕的代码.他们都符合以下模式:

if (some_condition) {
    /* do something really simple and return */
} else {
    /* something complex that needs lots of registers */
}
Run Code Online (Sandbox Code Playgroud)

将简单的情况看作是一个非常小的东西,一半或更多的工作花在推动和弹出不会被修改的寄存器上.如果我手动编写asm,我会在复杂的情况下保存并恢复已保存的跨调用寄存器,并且在简单的情况下完全避免触及堆栈指针.

有没有什么方法可以让gcc变得更聪明并且自己做到这一点?最好使用命令行选项,而不是源代码中的丑陋黑客...

编辑:为了使它具体化,这里有一些非常接近我正在处理的一些函数:

if (buf->pos < buf->end) {
    return *buf->pos++;
} else {
    /* fill buffer */
}
Run Code Online (Sandbox Code Playgroud)

另一个:

if (!initialized) {
    /* complex initialization procedure */
}
return &initialized_object;
Run Code Online (Sandbox Code Playgroud)

另一个:

if (mutex->type == SIMPLE) {
    return atomic_swap(&mutex->lock, 1);
} else {
    /* deal with ownership, etc. */
}
Run Code Online (Sandbox Code Playgroud)

编辑2:我应该首先提到:这些函数不能内联.他们有外部联系,他们是图书馆代码.允许它们在应用程序中内联将导致各种问题.

c x86 gcc code-generation

12
推荐指数
1
解决办法
2157
查看次数

标签 统计

x86 ×2

assembly ×1

c ×1

code-generation ×1

gcc ×1