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



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

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

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

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

我想问的是:str 的值是否在callq 1070 <malloc@plt>之后和mov %rax,-0x8(%rbp)之前立即在 %rax 中恢复?

你的问题非常不清楚。

str变量驻留在内存中的地址rpb[-8]处。在malloc返回后,寄存器rax包含malloc返回值,该值存储在地址rbp[-8]的存储器中(即存储在str中)。

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

最新更新