Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

178
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!