这个 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()
.
或者它是完全不同的东西,恰好看起来像编译器为虚函数调用发出的东西。没有更多上下文,您无法知道。
这是来自 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()
.
或者它是完全不同的东西,恰好看起来像编译器为虚函数调用发出的东西。没有更多上下文,您无法知道。