2016-12-28 3 views
2

Я довольно новичок в программировании и хотел спросить, почему я получаю тот же результат с другим кодом. Я действительно читаю книгу, а пример в книге - с printf (также в Assembler). В этом случае он говорит <[email protected]>. Код ассемблера в книге отличается от моего, но код C такой же. Мой процессор просто вычисляет разные?Почему это показывает, когда я разбираю независимо от того, использую ли я printf или puts?

(Проблема при вызове <+34><[email protected]>)

Код 1:

#include <stdio.h> 

int main() 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     printf("Hello, world!\n"); 
    } 
    return 0; 
} 

Код 2:

#include <stdio.h> 

int main() 
{ 
    int i; 
    for(i=0; i<10; i++) 
    { 
     puts("Hello, world!\n"); 
    } 
    return 0; 
} 

Код 1 разобрали:

Dump of assembler code for function main: 
    0x080483eb <+0>: lea ecx,[esp+0x4] 
    0x080483ef <+4>: and esp,0xfffffff0 
    0x080483f2 <+7>: push DWORD PTR [ecx-0x4] 
    0x080483f5 <+10>: push ebp 
    0x080483f6 <+11>: mov ebp,esp 
    0x080483f8 <+13>: push ecx 
=> 0x080483f9 <+14>: sub esp,0x14 
    0x080483fc <+17>: mov DWORD PTR [ebp-0xc],0x0 
    0x08048403 <+24>: jmp 0x8048419 <main+46> 
    0x08048405 <+26>: sub esp,0xc 
    0x08048408 <+29>: push 0x80484b0 
    0x0804840d <+34>: call 0x80482c0 <[email protected]> 
    0x08048412 <+39>: add esp,0x10 
    0x08048415 <+42>: add DWORD PTR [ebp-0xc],0x1 
    0x08048419 <+46>: cmp DWORD PTR [ebp-0xc],0x9 
    0x0804841d <+50>: jle 0x8048405 <main+26> 
    0x0804841f <+52>: mov eax,0x0 
    0x08048424 <+57>: mov ecx,DWORD PTR [ebp-0x4] 
    0x08048427 <+60>: leave 
    0x08048428 <+61>: lea esp,[ecx-0x4] 
    0x0804842b <+64>: ret  
End of assembler dump. 

Код 2 разобран:

Dump of assembler code for function main: 
    0x080483eb <+0>: lea ecx,[esp+0x4] 
    0x080483ef <+4>: and esp,0xfffffff0 
    0x080483f2 <+7>: push DWORD PTR [ecx-0x4] 
    0x080483f5 <+10>: push ebp 
    0x080483f6 <+11>: mov ebp,esp 
    0x080483f8 <+13>: push ecx 
    0x080483f9 <+14>: sub esp,0x14 
    0x080483fc <+17>: mov DWORD PTR [ebp-0xc],0x0 
    0x08048403 <+24>: jmp 0x8048419 <main+46> 
=> 0x08048405 <+26>: sub esp,0xc 
    0x08048408 <+29>: push 0x80484b0 
    0x0804840d <+34>: call 0x80482c0 <[email protected]> 
    0x08048412 <+39>: add esp,0x10 
    0x08048415 <+42>: add DWORD PTR [ebp-0xc],0x1 
    0x08048419 <+46>: cmp DWORD PTR [ebp-0xc],0x9 
    0x0804841d <+50>: jle 0x8048405 <main+26> 
    0x0804841f <+52>: mov eax,0x0 
    0x08048424 <+57>: mov ecx,DWORD PTR [ebp-0x4] 
    0x08048427 <+60>: leave 
    0x08048428 <+61>: lea esp,[ecx-0x4] 
    0x0804842b <+64>: ret  
End of assembler dump. 
+4

GNU 'gcc' считает целесообразным заменить' printf ("some string \ n") 'на' puts («some string»); '- так оно и есть. Это оптимизация; 'puts()' не должен интерпретировать строку формата. –

+1

Связано: [Может ли printf быть заменен автоматически помещается в программу C?] (Https://stackoverflow.com/questions/25816659/can-printf-get-replaced-by-puts-automatically-in-ac-program) –

+0

Хорошо спасибо за помощь! :) –

ответ

2

puts функция является предпочтительным, поскольку он проще в обоих функциональности (не строка формата декодирования) и передачи аргументов.

Например, в соглашениях об условных обозначениях системы V ABI x86 необходимо задать количество аргументов XMM (YMM) (printf является переменным) в RAX. puts проще, поскольку только один аргумент передается с RDI.

+0

с комментариями выше, это помогло мне THX –

Смежные вопросы