Duda sobre punteros pasados por stack

Duda sobre punteros pasados por stack

de Carlos Guillermo Batalla Rovira -
Número de respuestas: 8


Buenas tardes, tengo una duda respecto al pasaje de punteros por stack.

En las siguientes soluciones de examen se dice que los punteros son desplazamientos respecto al registro ES, pero en ambas cuando compara el puntero con NULL lo hace de formas distintas, quisiera saber cual es la correcta.

Dejo los fragmentos de los respectivos exámenes.

Julio 2017

mov bx, [bp + 4]
cmp word ptr es:[bx + 2], 0 // if (nodo → izq != NULL)


Diciembre 2017

MOV BX, [BP + 6]
CMP BX, 0 // if (arquiArbolito != NULL)

Gracias.

En respuesta a Carlos Guillermo Batalla Rovira

Re: Duda sobre punteros pasados por stack

de Santiago De Los Santos Fernandez -

Estan bien las dos, lo que pasa es que arquiArbolito es un puntero, osea el desplazamiento con respecto a ES donde se encuentra el struct, y si miras el struct, en la posicion es:bx+2 tenes el PUNTERO al nodo izquierdo del struct, no el nodo en si.

Espero que se entienda.

En respuesta a Santiago De Los Santos Fernandez

Re: Duda sobre punteros pasados por stack

de Luis Guillermo Cuadro Benitez -

Me parece que no son exactamente lo mismo, pero los docentes lo pueden tomar como correcto, según el teórico cuando se usa BX ó SI el segmento por defecto es Data Segment (DS), y el la letra dice los punteros son desplazamientos dentro de ES, entonces me parece que hay que indicar que el registro de segmento donde esta BX es ES, sino como dice el teórico por defecto se asume DS.

Luego:

cmp word ptr es:[bx + 2], 0 // if (nodo → izq != NULL)

La primer observación que hago acá son, los tipos de argumentos de los operandos son "m" e "i" (memoria, e inmediato), la operación está adimensionada, por eso usa el  word ptr es:[bx + 2] para comparar cosas de igual tamaño. En el otro caso (CMP BX, 0) no usa word ptr porque la operación toma la dimensión del registro, osea 16 bits, los tipos de argumentos son "r" e "i" (registro, inmeditato) por eso no usa word prt.  De todos modos, creo tendría que ir así:  "cmp  word ptr es: [bx], 0" por lo comentado arriba con respecto al segmento por defecto.  

Con respecto a los que Santiago, no estoy de acuerdo, en mi opinión el puntero al nodo izquierdo esta en ES:[BX+3] y no en la posición es:[bx+2]. 


Estaría bueno que algún profesor responda que es lo correcto a realizar


Pd: Hay varias soluciones con detalles o errores, en mi opinión en el examen de Dic 2017 lo correcto debería ser "cmp word ptr es:[bx], 0",  como en la solución de Julio 2017.


Saludos. 






En respuesta a Luis Guillermo Cuadro Benitez

Re: Duda sobre punteros pasados por stack

de Federico Rivero -

Estimado:

No contesté porque lo contestado por Santiago está BIEN.

Tu mensaje confunde un poco y tiene errores. Hay varios puntos mencionados, voy a tratar de ir uno por uno, contestando todo el thread:

1) Diferencia entre lo planteado por Carlos al inicio.

Julio 2017

mov bx, [bp + 4]
cmp word ptr es:[bx + 2], 0 // if (nodo → izq != NULL)

Diciembre 2017

MOV BX, [BP + 6]
CMP BX, 0 // if (arquiArbolito != NULL)

Como comentaron en la primer respuesta, no hay error en ninguno de los dos casos. Son diferentes porque se están haciendo cosas diferentes. En el primer caso, se quiere comparar el puntero al nodo hijo y en el segundo caso se quiere comparar el puntero al nodo padre. El puntero al nodo padre está en el stack, por lo cual basta con obtenerlo y compararlo con cero, pero el puntero al nodo hijo está en el segmento ES, dentro de la estructura del nodo padre. Por eso se tiene que obtener el puntero al nodo padre del stack y luego ir a memoria (ES:[BX + 2]) para comparar el nodo hijo.

2) Sobre los segmentos implícitos.

Sí, si se usa BX o SI sin segmento explícito, se va a DX. Pero en todos estos ejemplos eso no ocurre nunca. El único desplazamiento que se usa sin segmento explícito en estos ejemplos es BP, y para este registro el segmento implícito es SS (stack segment). Es decir que [BP + 6] va hacia el stack.

3) Sobre el PD

En la estructura de Julio 2017, el puntero al nodo izquierdo está en ES:[BX + 2], en la estructura de diciembre 2017, el puntero al nodo izquierdo está en ES:[BX + 3]. Esto es por cómo están definidas las estructuras (revisar y ver que son diferentes).

Saludos,
Federico

En respuesta a Federico Rivero

Re: Duda sobre punteros pasados por stack

de Luis Guillermo Cuadro Benitez -
Federico, bien ahora quedo un poco más claro entonces.


Con respecto a este comentario "Tu mensaje confunde un poco y tiene errores" 

Podrías decirme que es lo que te confunde? Lo de dimensionar la operación? No hiciste comentario con respecto a eso. 


Y con respecto al puntero al nodo izquierdo que habla Santiago, si lees BIEN el mensaje se entiende que hace referencia al examen de Dic 2017 pues habla de arquiArbolito. 

El mensaje dice

"lo que pasa es que arquiArbolito es un puntero, osea el desplazamiento con respecto a ES donde se encuentra el struct, y si miras el struct, en la posicion es:bx+2 tenes el PUNTERO al nodo izquierdo del struct" . 

Con lo cual en el ejercicio de arquiArbolito  es:bx+2 NO es el nodo izquierdo. Por eso me parecía que no estaba bien. 


Saludos. 





En respuesta a Luis Guillermo Cuadro Benitez

Re: Duda sobre punteros pasados por stack

de Federico Rivero -

Estimado,

Con lo del mensaje me refería a que me confundió a mi. Imagino que si me confundió a mi puede confundir a muchos más, pero es una idea :)

Es cierto que Santiago se refería a Diciembre. De todos modos quedó explicado, espero que quienes lean luego lo entiendan. Y tenés razón también en que me faltaron algunos puntos:

4) Lo de cuándo va o no el word ptr lo explicaste bien!

5) Hay un error cuando decís:  "De todos modos, creo tendría que ir así:  "cmp  word ptr es: [bx], 0" por lo comentado arriba con respecto al segmento por defecto.".

Me parece que estás entendiendo que cmp BX, 0 compara la dirección de memoria apuntada por DS:[BX] con 0 (estimo que de ahí sale el tema de los segmentos por defecto y tu propuesta), pero no. cmp BX, 0 compara el contenido de BX con 0. El contenido de BX a esa altura es el puntero a árbol. Que el valor de ese registro sea 0, equivale a arbol == NULL. Por las dudas, word ptr ES:[BX] serían los dos primeros bytes del nodo, es decir, el char arquichirimbolo y el primer byte del puntero izquierdo del hijo. 

Saludos,

      Federico

PD: las mayúsculas y negritas me pueden haber quedado agresivas, pero intenté resaltar para quienes leyeran por arriba el mensaje y se quisieran llevar la idea.

En respuesta a Federico Rivero

Re: Duda sobre punteros pasados por stack

de Lautaro Cardozo Ramirez -

Ya que estamos con este ejercicio.  

Está bien hacer push con direccionamiento a memoria?  En la clase de consulta me dijeron que no ya que es un direccionamiento de memoria a memoria.  

En respuesta a Lautaro Cardozo Ramirez

Re: Duda sobre punteros pasados por stack

de Federico Rivero -

Estimado:

Es posible sí. Es cierto que resulta en una operación 'memoria-memoria', pero es permitida (ver cartilla). Es más, a los efectos de los ejercicios que van a ver es la única permitida.

Saludos,

       Federico