Почему дизассемблирование `printf ("% f ", 6.4);` так сложно? - PullRequest
0 голосов
/ 30 марта 2011
(gdb) l main
1   #include <stdio.h>
2   
3   int main(void)
4   {
5       //int i = 6;
6       printf("%f",6.4);
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>:    mov    $0x401999999999999a,%rax
0x00000000004004aa <main+18>:   mov    %rax,-0x8(%rbp)
0x00000000004004ae <main+22>:   movsd  -0x8(%rbp),%xmm0
0x00000000004004b3 <main+27>:   mov    $0x4005c8,%edi
0x00000000004004b8 <main+32>:   mov    $0x1,%eax
0x00000000004004bd <main+37>:   callq  0x400398 <printf@plt>

Почему так сложно (я заметил, что сложность вызвана float)?

Кстати, в чем разница между $0x1 и 0x1?

(gdb) p 0x10
$4 = 16
(gdb) p $0x10
$5 = void

Ответы [ 2 ]

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

Первые параметры с плавающей точкой задаются подпрограмме в xmm0, xmm1 ... в ABI x86-64.Нет инструкции для перемещения немедленного (представление с плавающей точкой 6.4) непосредственно в регистр xmm, поэтому он сначала помещается в стек, а затем перемещается в xmm0.Другим параметром, конечно же, является адрес строки формата.

Разница между $ 1 и 1 состоит в том, что первое используется как непосредственная константа, а второе - как смещение адреса или адрес.

2 голосов
/ 31 марта 2011

Потому что вы скомпилировали без какой-либо оптимизации.Попробуйте -Os:

pushq   %rbp                     // save old frame pointer
movq    %rsp,  %rbp              // establish new frame pointer
leaq    0x0000004d(%rip), %rdi   // load address of format string ("%f")
movsd   0x0000003d(%rip), %xmm0  // load 6.4
movb    $0x01, %al               // load number of VA_ARGS (1)
callq   _printf                  // call printf
xorl    %eax,  %eax              // conjure return value (0)
popq    %rbp                     // restore frame pointer
ret                              // return

Что в этом сложного?

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