这个 x86_64 汇编代码有什么作用?

what does this x86_64 asm code do?

这是来自 64 位 Linux 共享对象:

mov     rax, [rbp+var_1C+4]
mov     rax, [rax]
add     rax, 8
mov     rax, [rax]
mov     rdx, [rbp+var_1C+4]
mov     rdi, rdx
call    rax

看起来像虚函数调用。

看起来像未优化的编译器输出,假设使用 rbp 作为帧指针,并使用 add rax,8 而不是像 mov rax, [rax+8] 这样的寻址模式。并且无缘无故地重新加载本地指针,因为它本可以在较早加载指针后将其保留在寄存器中。

看起来它正在准备一个 this 指针作为虚函数的 arg,以及通过 vtable 调用虚函数。

总之这段代码只是一种低效的写法

mov    rdi, [rbp+var_1C+4]    # load a pointer to a local from the stack
mov    rax, [rdi]             # load the vtable pointer from the start of the object
call   [rax+8]                # index into the vtable

或者可能设置 rdx 是有意的,而不仅仅是低效的未优化代码。在 x86-64 System V ABI 中,rdx 保存函数调用的第三个整数/指针 arg。 rdi 持有第一个(包括 this 作为隐藏的第一个参数)。如果之前设置了 rsi,那么可能有意传递了 rdx,所以它是一个类似 foo->virtual_function(something, foo) 的调用,其中 class something *foo 是一个局部变量或函数参数。

否则就是foo->virtual_function().


或者它是完全不同的东西,恰好看起来像编译器为虚函数调用发出的东西。没有更多上下文,您无法知道。