Мне нужна помощь, чтобы понять, что означают некоторые инструкции - PullRequest
0 голосов
/ 21 мая 2019

Я изучаю сборку 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 голосов
/ 22 мая 2019

sub $0x10,%rsp выделяет пространство в стеке, это то же самое, что дважды * * * * * *, но значение в выделенном пространстве стека не обязательно будет равно нулю, но это нормально, так как инструкции mov, используемые позже, заменяютфигня с реальными данными.

Как правильно сказал Майкл, mov $0x0,%eax объясняется тем, что printf (как и любая другая функция varargs) принимает число аргументов в rax.

...