%rax 寄存器是否在 'call' 指令之后包含函数的 return 值?

Does the %rax register contain the return value of function right after the 'call' instruction?

这是一个简单的反汇编代码。

push   %rbp
mov    %rsp,%rbp
sub    [=12=]x10,%rsp
movq   [=12=]x0,-0x8(%rbp)
mov    [=12=]xf,%edi
callq  1070 <malloc@plt>
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rdi
callq  1060 <free@plt>
mov    [=12=]x0,%eax

malloc函数的return值是否在callq 1070 <malloc@plt>之后立即恢复到rax寄存器中? 我检测了调用 malloc_usable_size 的代码以获取 malloc 函数的 malloced 大小,但它遇到了 segmentation fault。我还以为我把地址转错了malloc_usable_size.

对于str = (char *) malloc(15);,值str是否保存在%rax中? 我想问的是:str的值是否在callq 1070 <malloc@plt>之后mov %rax,-0x8(%rbp)之前的%rax中恢复了?可以使用%rax的值来获取malloced area的信息,比如malloced area的大小?

What I want to ask is: if the value of str is restored in %rax right after callq 1070 <malloc@plt> and before mov %rax,-0x8(%rbp)?

你的问题非常不清楚。

str 变量驻留在地址 rpb[-8] 的内存中。在 malloc return 之后,寄存器 rax 立即包含 malloc return 值,并且该值被 存储 在地址 rbp[-8] 的内存中(即它存储在 str)。

请注意,您的反汇编使用的是 AT&T 语法。此指令 mov %rax,-0x8(%rbp) 将值存储在 rax 中的位置 rpb[-8]