Я не могу полностью понять этот код сборки - PullRequest
0 голосов
/ 23 декабря 2019

Вот код сборки main:

push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    (%rax),%rax
mov    %rax,%rdi
callq  0x510 <atoi@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%edx
mov    -0x14(%rbp),%eax
mov    %edx,%esi
mov    %eax,%edi
callq  0x63a <sub>
leaveq 
retq 

А вот соответствующий код C:

#include <stdlib.h>
int sub(int x, int y){
        return 2*x+y;
}

int main(int argc, char ** argv){
        int a;
        a = atoi(argv[1]);
        return sub(argc,a);
}

Я считаю, что он выделяет 20 бит в стеке, тогда этотолкая значения параметров справа налево в rbp - 14 и rbp - 20, я прав? Почему она должна быть 20 бит? и почему 0x8 добавляется в rax?

1 Ответ

0 голосов
/ 23 декабря 2019

Вот аннотированная версия: / установить фрейм стека. Стеки должны быть выровнены в соответствии с 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 
...