Проблема анализа сборки - PullRequest
0 голосов
/ 29 марта 2011
(gdb) l main
1   #include <stdio.h>
2   
3   int main(void)
4   {
5       int i = 6;
6       printf("%d",sizeof(unsigned short));
7       return 0;
8   }
(gdb) disas main
Dump of assembler code for function main:
0x0000000000400498 <main+0>:    push   %rbp
0x0000000000400499 <main+1>:    mov    %rsp,%rbp
0x000000000040049c <main+4>:    sub    $0x10,%rsp
0x00000000004004a0 <main+8>:    movl   $0x6,-0x4(%rbp)
0x00000000004004a7 <main+15>:   mov    $0x2,%esi
0x00000000004004ac <main+20>:   mov    $0x4005c8,%edi
0x00000000004004b1 <main+25>:   mov    $0x0,%eax
0x00000000004004b6 <main+30>:   callq  0x400398 <printf@plt>
0x00000000004004bb <main+35>:   mov    $0x0,%eax
0x00000000004004c0 <main+40>:   leaveq 
0x00000000004004c1 <main+41>:   retq   

У меня есть два сомнения:

  1. Для int i = 6 требуется только 4 байт, почему выделено 16 байт?
  2. некоторые функции используют стек для передачи параметров (push xxx), но почему printf использует esi и edi для этого?

UPDATE

кажется printf не извлекается из esi и edi:

(gdb) disas printf
Dump of assembler code for function printf@plt:
0x0000000000400398 <printf@plt+0>:  jmpq   *0x2004c2(%rip)        # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
0x000000000040039e <printf@plt+6>:  pushq  $0x0
0x00000000004003a3 <printf@plt+11>: jmpq   0x400388

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

почему 16 байтов

Поскольку x86_64 ABI требует, чтобы стек был выровнен по 16 байтов перед инструкцией вызова

почему printf использует esi и edi

Поскольку x86_64 ABI указывает, что (первые 6) целочисленные параметры передаются в регистрах rdi, rsi, rdx, rcx, r8 и r9.

1 голос
/ 29 марта 2011
  1. Это должно быть 4 байта для int, 8 байтов для указателя кадра стека (64-битный регистр rbp) и 4 байта для возвращаемого значения (в стеке).

  2. Я действительно не был свидетелем этого (я oldschool: P), но я слышал, что это новый способ подтолкнуть ценности. Предполагается, что он будет быстрее за счет непосредственного хранения значений в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...