Ver Mensaje Individual
  #3 (permalink)  
Antiguo 28/05/2011, 20:48
sam90
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Llaves dentro de funcion

Si compilas con GCC y la opcion -S te devuleve el codigo assembler del programa.

Código C:
Ver original
  1. int main() {
  2.  
  3. int x, y,z;
  4. x = 5;
  5. y = 4;
  6. z = x + y;
  7.  
  8. {
  9. int y = 20;
  10. }
  11.  
  12. x = y;
  13. return 0;
  14. }
Código C:
Ver original
  1. .file   "h.c"
  2.     .def    ___main;    .scl    2;  .type   32; .endef
  3.     .text
  4. .globl _main
  5.     .def    _main;  .scl    2;  .type   32; .endef
  6. _main:
  7.     pushl   %ebp
  8.     movl    %esp, %ebp
  9.     subl    $24, %esp
  10.     andl    $-16, %esp
  11.     movl    $0, %eax
  12.     addl    $15, %eax
  13.     addl    $15, %eax
  14.     shrl    $4, %eax
  15.     sall    $4, %eax
  16.     movl    %eax, -20(%ebp)
  17.     movl    -20(%ebp), %eax
  18.     call    __alloca
  19.     call    ___main
  20.     movl    $5, -4(%ebp)
  21.     movl    $4, -8(%ebp)
  22.     movl    -8(%ebp), %eax
  23.     addl    -4(%ebp), %eax
  24.     movl    %eax, -12(%ebp)
  25.     movl    $20, -16(%ebp)
  26.     movl    -8(%ebp), %eax
  27.     movl    %eax, -4(%ebp)
  28.     movl    $0, %eax
  29.     leave
  30.     ret

Por si no conoces algo de assembler, con movl asignas memoria, con add sumas.

Ahora analisemos un poco el codigo.

movl $5, -4(%ebp)


Esto esta asignando 5 a una parte de la memoria. En nuetro ejemplo teniamos x=5; por lo que deducimos que -4(%ebp) es la direccion de X (por asi decirlo).

movl $4, -8(%ebp)

Esto asigna 4 a -8(%ebp) por lo tanto es Y.



movl -8(%ebp), %eax
addl -4(%ebp), %eax
movl %eax, -12(%ebp)

Se carga Y en registro, se le suma X a ese registro y se guarda en -12(%ebp) que es Z.

movl $20, -16(%ebp)

Se asigna 20 a -16(%ebp). En nuetro codigo decia Y = 20; que estaba entre los corchetes, pero vemos que usa otra direccion, por lo tanto en el ambito este es como tener dos variables separadas. Nada mas que dentro de esas llaves tiene el mismo nombre que otra variable. Por lo que estamos haciendo inaccesible a la primer Y.

Espero haberte ayudado con tu duda. Yo acabo de aprender una nueva herramienta de C/c++.