Мен x86-ны аздап алуға тырысып жатырмын. Мен 64 биттік Mac-та gcc -S -O0-мен жинақтап жатырмын.
C кодындағы код:
printf("%d", 1);
Шығарылым:
movl $1, %esi
leaq LC0(%rip), %rdi
movl $0, %eax ; WHY?
call _printf
% eax неге 'printf' деп аталмас бұрын 0-ге дейін тазаланатынын түсінбеймін. printf
басылған таңбалардың санын % eax
деп қайтаратындықтан, менің ойымша, оны дайындау үшін нөлге теңестірілген printf
, бірақ мен деп ойладым. printf
оны дайындауға жауапты болуы керек еді. Сонымен қатар, керісінше, егер мен өз функциямды int testproc (int p1)
деп атайтын болсам, gcc
дайындаудың қажеті жоқ % eax
. Сондықтан неге gcc
printf
және testproc
басқаша қарайды.