我需要帮助来理解一些说明的含义
I need help understanding what some instructions mean
我正在学习 x86 汇编,但在理解某些指令时遇到了一些问题。 sub [=11=]x10,%rsp
是什么意思,为什么 GCC 将 mov [=12=]x0,%eax
行复制了两次?
0x0000000000001135 <+0>: push %rbp
0x0000000000001136 <+1>: mov %rsp,%rbp
0x0000000000001139 <+4>: sub [=10=]x10,%rsp
0x000000000000113d <+8>: movl [=10=]xa,-0x4(%rbp)
0x0000000000001144 <+15>: mov -0x4(%rbp),%eax
0x0000000000001147 <+18>: mov %eax,%esi
0x0000000000001149 <+20>: lea 0xeb4(%rip),%rdi # 0x2004
0x0000000000001150 <+27>: mov [=10=]x0,%eax
0x0000000000001155 <+32>: callq 0x1030 <printf@plt>
0x000000000000115a <+37>: mov [=10=]x0,%eax
0x000000000000115f <+42>: leaveq
0x0000000000001160 <+43>: retq
sub [=10=]x10,%rsp
在堆栈上分配 space,这与执行两次 pushq 0
相同,只是分配堆栈中的值 space 不一定为零,但这没关系,因为稍后使用的 mov
指令用真实数据替换了垃圾。
正如 Michael 正确指出的那样,mov [=13=]x0,%eax
是因为 printf
(以及任何其他可变参数函数)采用 rax
.
中的参数数量
我正在学习 x86 汇编,但在理解某些指令时遇到了一些问题。 sub [=11=]x10,%rsp
是什么意思,为什么 GCC 将 mov [=12=]x0,%eax
行复制了两次?
0x0000000000001135 <+0>: push %rbp
0x0000000000001136 <+1>: mov %rsp,%rbp
0x0000000000001139 <+4>: sub [=10=]x10,%rsp
0x000000000000113d <+8>: movl [=10=]xa,-0x4(%rbp)
0x0000000000001144 <+15>: mov -0x4(%rbp),%eax
0x0000000000001147 <+18>: mov %eax,%esi
0x0000000000001149 <+20>: lea 0xeb4(%rip),%rdi # 0x2004
0x0000000000001150 <+27>: mov [=10=]x0,%eax
0x0000000000001155 <+32>: callq 0x1030 <printf@plt>
0x000000000000115a <+37>: mov [=10=]x0,%eax
0x000000000000115f <+42>: leaveq
0x0000000000001160 <+43>: retq
sub [=10=]x10,%rsp
在堆栈上分配 space,这与执行两次 pushq 0
相同,只是分配堆栈中的值 space 不一定为零,但这没关系,因为稍后使用的 mov
指令用真实数据替换了垃圾。
正如 Michael 正确指出的那样,mov [=13=]x0,%eax
是因为 printf
(以及任何其他可变参数函数)采用 rax
.