相关疑难解决方法(0)

为什么这个函数将RAX作为第一个操作推送到堆栈?

在下面的C++源代码的汇编中.为什么RAX被推入堆栈?

正如我从ABI理解的那样,RAX可以包含来自调用函数的任何内容.但是我们将它保存在这里,然后将堆栈移回8个字节.所以堆栈上的RAX,我认为只与std::__throw_bad_function_call()操作相关......?

代码:-

#include <functional> 

void f(std::function<void()> a) 
{
  a(); 
}
Run Code Online (Sandbox Code Playgroud)

gcc.godbolt.org使用Clang 3.7.1 -O3 输出:

f(std::function<void ()>):                  # @f(std::function<void ()>)
        push    rax
        cmp     qword ptr [rdi + 16], 0
        je      .LBB0_1
        add     rsp, 8
        jmp     qword ptr [rdi + 24]    # TAILCALL
.LBB0_1:
        call    std::__throw_bad_function_call()
Run Code Online (Sandbox Code Playgroud)

我确定原因很明显,但我很难弄清楚.

这是一个没有std::function<void()>包装器的尾部调用,用于比较:

void g(void(*a)())
{
  a(); 
}
Run Code Online (Sandbox Code Playgroud)

琐碎的:

g(void (*)()):             # @g(void (*)())
        jmp     rdi        # TAILCALL
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly x86-64 abi

22
推荐指数
3
解决办法
2098
查看次数

我可以从堆栈中 POP 一个值,但在 NASM 程序集中无处放置吗?

NASM 程序集,Ubuntu,32 位程序。

通常,当从堆栈中弹出一个值时,我会做

POP somewhere
Run Code Online (Sandbox Code Playgroud)

放入寄存器或变量。但有时,我只是不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做

POP
Run Code Online (Sandbox Code Playgroud)

就像那样是行不通的。

我的解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP到其中。有没有更好的方法来实现这一目标?

x86 stack nasm stack-memory stack-pointer

6
推荐指数
2
解决办法
3271
查看次数

标签 统计

x86 ×2

abi ×1

assembly ×1

c++ ×1

nasm ×1

stack ×1

stack-memory ×1

stack-pointer ×1

x86-64 ×1