【发布时间】:2018-06-13 22:07:41
【问题描述】:
我在理解这个汇编代码的作用时遇到了问题(这是一个较大的汇编代码的一小部分,这是 Intel 语法):
vector<int> func(int i) { ...} // C++ source
clang 输出from the Godbolt compiler explorer:
func(int): # @func(int)
push rbp
push rbx
push rax
mov ebp, esi
mov rbx, rdi
xorps xmm0, xmm0
movups xmmword ptr [rbx], xmm0
mov qword ptr [rbx + 16], 0
这是在 Linux 上编译的,遵循官方的 System V AMD64 ABI。 根据this link,rdi 寄存器用于将第一个参数传递给函数。 所以在这一行
mov rbx, rdi
我们将参数的值(在本例中为 int)移动到 rbx。不久之后,我们会这样做:
movups xmmword ptr [rbx], xmm0
这是我不明白的。 rbx 包含参数的值,是一个int,这里我们将xmm0 的内容复制到rbx 指向的地址(但是rbx 不包含任何地址,只是函数的参数!)
有些东西我弄错了,但我不知道为什么。
【问题讨论】:
-
对象通过隐藏的第一个参数返回。因此,您的函数看起来更像
func(vector<int>* result, int i)。rdi是指向返回结果的指针,i在esi(第二个参数槽)中。 -
@Jester,你应该把这个作为答案。
-
请注意,并非所有对象都返回隐藏指针:ABI 允许您将大多数 16 字节或更少的对象打包到
rax和rdx寄存器作为返回值,但std::vector通常为 24 字节,因此最终使用隐藏指针。
标签: assembly x86-64 calling-convention