我需要帮助来了解一些说明的含义

时间:2019-05-21 13:55:04

标签: assembly x86-64 att

我正在学习x86汇编,并且在理解某些说明时遇到一些问题。 sub $0x10,%rsp是什么意思,为什么GCC会两次复制此mov $0x0,%eax行?

0x0000000000001135 <+0>:    push   %rbp   
0x0000000000001136 <+1>:    mov    %rsp,%rbp
0x0000000000001139 <+4>:    sub    $0x10,%rsp
0x000000000000113d <+8>:    movl   $0xa,-0x4(%rbp)  
0x0000000000001144 <+15>:   mov    -0x4(%rbp),%eax
0x0000000000001147 <+18>:   mov    %eax,%esi
0x0000000000001149 <+20>:   lea    0xeb4(%rip),%rdi        # 0x2004
0x0000000000001150 <+27>:   mov    $0x0,%eax
0x0000000000001155 <+32>:   callq  0x1030 <printf@plt>
0x000000000000115a <+37>:   mov    $0x0,%eax
0x000000000000115f <+42>:   leaveq 
0x0000000000001160 <+43>:   retq

1 个答案:

答案 0 :(得分:0)

sub $0x10,%rsp在堆栈上分配空间,与两次执行pushq 0相同,只是分配的堆栈空间中的值不一定为零,但这是可以的,因为{{1}稍后使用的指令用实际数据替换垃圾。

正如迈克尔正确地指出的,mov是因为mov $0x0,%eax(以及任何其他varargs函数)采用了printf中的参数个数。