En el siguiente código C:
#include <stdio.h> int main(void){getchar();}Produce el siguiente asm:
main: push rbp mov rbp, rsp # no extra instruction here when header is included call getchar mov eax, 0 pop rbp ret Sin embargo, si no stdio.h en el archivo, entonces aún se compila, pero agrega lo que parece una instrucción aleatoria mov eax, 0 :
Aquí está Compiler Explorer: https://godbolt.org/z/3fTcss . ¿Es esto solo parte del "comportamiento indefinido", o hay una razón particular por la que se agrega allí la instrucción antes call getchar ?
Sin el encabezado, gcc proporciona una declaración implícita de getchar cuando lo usa, como si hubiera declarado previamente
int getchar();(Este comportamiento estaba garantizado por versiones anteriores del estándar C. Las versiones actuales hacen que sea un comportamiento indefinido usar una función que no se declaró previamente, pero gcc aún proporciona el comportamiento anterior como una extensión).
Esta declaración no proporciona información sobre los tipos de argumentos que espera getchar . (Recuerde que, a diferencia de C++, una declaración con () no declara que una función no toma argumentos, sino que toma argumentos no especificados , dejando que el programador sepa qué espera la función y pase el número y tipo de argumentos adecuados .) Por lo que sabe el compilador, incluso podría ser variable, y según la ABI x86-64 al , las funciones variables esperan en todo el número de registros vectoriales que se utilizan para pasar argumentos. Aquí no se utilizan registros vectoriales, por lo que el compilador establece al en 0 antes de la llamada. (Es un poco más eficiente poner a cero todo rax , por lo que lo hace en su lugar).