O código gerado pelo compilador C Minúsculo C emite NOPs e JMPs extras (desnecessários)

Alguém pode explicar por que esse código:

#include <stdio.h>

int main()
{
  return 0;
}

quando compilado com tcc usandotcc code.c produz este asm:

00401000  |.  55               PUSH EBP
00401001  |.  89E5             MOV EBP,ESP
00401003  |.  81EC 00000000    SUB ESP,0
00401009  |.  90               NOP
0040100A  |.  B8 00000000      MOV EAX,0
0040100F  |.  E9 00000000      JMP fmt_vuln1.00401014
00401014  |.  C9               LEAVE
00401015  |.  C3               RETN

Eu acho qu

00401009  |.  90   NOP

talvez esteja lá para algum alinhamento de memória, mas e quanto a

0040100F  |.  E9 00000000     JMP fmt_vuln1.00401014
00401014  |.  C9              LEAVE

Quero dizer, por que o compilador insere esse salto próximo que salta para oPróxim instrução, LEAVE seria executado de qualquer maneir

Estou no Windows de 64 bits gerando executável de 32 bits usando o TCC 0.9.2

questionAnswers(2)

yourAnswerToTheQuestion