Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

169
Vistas
¿Por qué se borra EAX antes de llamar a una función si no incluyo el encabezado?

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 :

ingrese la descripción de la imagen aquí

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 ?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda