19/09/2019, 10:12:43 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: LISTADO ACTUALIZADO DE CURSOS
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Árboles en C y un poco de ASM  (Leído 1205 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Mushotoku
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 39



Ver Perfil
« : 13/09/2009, 01:20:29 am »

Les dejo mis dudas como comentarios en el código.

Spoiler (click para mostrar u ocultar)

Y un poco de assembler...

      .data

S:   .string "Hola mundo \n"
      .text
      .globl main

main:
      pushL $S
      call printf
      addL $4,%esp          # Simplemente no se el porque de esta instrucción
      movL $0,%eax         # Idem anterior
ret


Si alguien me puede aclarar estas dudas se lo agradecería.

Saludos.
En línea
Klaurus
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 47


Ver Perfil
« Respuesta #1 : 13/09/2009, 08:00:45 am »

Hace un tiempo que no veo arboles, pero lo que deduzco:

"Parbol a" es el nodo del arbol en el que vas a insertar un elemento. Inicialmente sería el nodo raíz, pero también podrías pasarle cualquier otro nodo.

a->n=n   --- Si a es nulo, entonces asigna al elemento n dentro de a el entero n pasado como parametro. Acá hay una mala práctica de programación que es la de ponerle a un parametro el mismo nombre que el de una variable dentro del árbol, sin embargo esto es posible y no dificulta otra cosa más que la lectura, que es lo que te debe haber pasado a vos. Acordate que cada vez que se quiera referir a la veriable n dentro de a, tiene que referirse a ella en la forma a->n y no solamente n.

¿Porque evalúa (n<a->n)?
Si no me equivoco, esto es un árbol binario, lo que significá que colocará todos los valores menores al nodo padre a su izquierda y todos los valores mayores al nodo padre a su derecha. El tema de que antes evalue a==NULL solo significará entonces que si a es nulo entonces a debe ser el primer nodo del árbol o a es un nodo hoja.

Con respecto a assembler no manejo bien el lenguaje, así que con eso no te puedo ayudar.
En línea
topo23
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Argentina Argentina

Mensajes: 940


Ver Perfil
« Respuesta #2 : 13/09/2009, 11:28:57 am »

main:
      pushL $S
      call printf
      addL $4,%esp          # Simplemente no se el porque de esta instrucción
      movL $0,%eax         # Idem anterior
ret

1. Esta sumandor 4 al stack pointer (esta limpiando el stack antes de retornar).
2. Esta asignando 0 al registro EAX (este registro se interpreta como el valor de retorno, es el equivalente de 'return 0;' en C).

En línea

.
Mushotoku
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 39



Ver Perfil
« Respuesta #3 : 13/09/2009, 04:05:38 pm »

Gracias Klaurus por la explicación.

Con respecto a la respuesta de topo23, sigo sin entender porque addL $4,%esp. ¿Porqué limpia el stack? ¿Porqué se "ensució"?

Saludos.
En línea
topo23
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Argentina Argentina

Mensajes: 940


Ver Perfil
« Respuesta #4 : 13/09/2009, 06:13:51 pm »

Se hace el addl por el pushl que esta al principio, el pushl lo que hace es movl $S,[%esp]; subl $4, %esp. Los parametros para una funcion se pasan utilizando el stack.

En C una funcion puede recibir una cantidad arbitraria de argumentos, en este caso printf recibe un argumento (la direccion del string $S), y es responsabilidad de la funcion que llama a printf liberar el stack.

El stack se utiliza, ademas de para pasar los argumentos, para guardar la direccion de retorno de una funcion. Asi que si una funcion no "limpia" el stack antes de retornar es muy probable que retorne a cualquier parte y termine causando que el programa se cuelgue.
En línea

.
Mushotoku
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 39



Ver Perfil
« Respuesta #5 : 13/09/2009, 07:41:36 pm »

Creo que voy entendiendo. Ahora si quisiera llamar 2 veces a printf, ¿podria hacer lo siguiente o deberia limpiar el stack despues de cada printf?

main:
      pushL $S
      call printf
      pushL $D         
      call printf
      addL $8,%esp
      movL $0,%eax         
ret

En línea
topo23
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Argentina Argentina

Mensajes: 940


Ver Perfil
« Respuesta #6 : 14/09/2009, 10:57:13 am »

Cualquiera de las dos formas estan bien, la diferencia es que si no limpias el stack entre llamadas entonces vas a necesitar un stack mas grande (8 bytes vs 12 bytes).
En línea

.
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!