Вот аннотированная версия: / установить фрейм стека. Стеки должны быть выровнены в соответствии с ABI, поэтому несмотря на то, что необходимо только 2 (* 8 = 16) местоположения, 4 8-байтовых (= 32) / местоположения зарезервированы. push% rbp mov% rsp,% rbp sub $ 0x20,% rsp
/ store away argc, argv for later.
mov %edi,-0x14(%rbp)
mov %rsi,-0x20(%rbp)
/ get the value of argv[1]: argv is a vector of char *, so
/ load argv:
mov -0x20(%rbp),%rax
/ index by 1:
add $0x8,%rax
/ load argv[1].
mov (%rax),%rax
/ copy into first parameter of atoi
mov %rax,%rdi
callq 0x510 <atoi@plt>
/ store the result
mov %eax,-0x4(%rbp)
/ load parameter 2 of sub:
mov -0x4(%rbp),%edx
/ load parameter 1 of sub (argc).
mov -0x14(%rbp),%eax
/ move parameters to abi parameter registers
mov %edx,%esi
mov %eax,%edi
callq 0x63a <sub>
/ remove stack frame for this function
leaveq
retq
Эта версия удаляет избыточную нагрузку, сохраняет для ясности:
push %rbp
mov %rsp,%rbp
sub $0x20,%rsp
mov %edi,-0x14(%rbp)
mov 8(%rsi), %rdi
callq 0x510 <atoi@plt>
mov %eax, %rsi
mov -0x14(%rbp), %rdi
callq 0x63a <sub>
leaveq
retq