Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

170
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda