[2022][Febrero][Problema 2]

[2022][Febrero][Problema 2]

de Marcos Dura Sosa -
Número de respuestas: 5

Buenas,

En la solucion define DS y ES para usar como segmento de cada arbol. Mi duda es que DS no lo termina usando nunca, en cambio hace [SI+8] (por ejemplo) sin antes usar DS, pero el ES si lo usa.

Queria saber si es un error de la solucion o si no me estoy dando cuenta de algo.

Muchas gracias!


En respuesta a Marcos Dura Sosa

Re: [2022][Febrero][Problema 2]

de Federico Rivero -
Hola Marcos!

No me queda claro dónde está la confusión, al obtener los parámetros del stack, se ejecuta:

mov CX, [BP+10] ; CX=segmento arbol1
mov DS, CX ; DS=seg a1

ahí carga el registro DS con el segmento del árbol 1. Luego, más adelante, se usa este segmento:

mov AX, [SI]

y

push [SI+8]

en ambos casos, el segmento implícito es DS, el cual fue cargado al inicio. Es decir, primero se carga el segmento, y luego se utiliza.

Si podés, con esta info, comentame qué es lo que no queda claro por favor.

Saludos!
Federico
En respuesta a Federico Rivero

Re: [2022][Febrero][Problema 2]

de Marco Liguori Hernandez -
Buenas,
Refloto el post con otras preguntas relacionadas al mismo ejercicio.

1. Para verificar si el arbol == NULL, hace un OR bit a bit entre el segmento y desplazamiento, saltando si resulta en cero esa operación. Tomando en cuenta que la posición 0 de memoria/segmento está reservada para punteros NULL, ¿no sería suficiente comparar el segmento con NULL para hacer ese chequeo?.
2. Veo en la solución que mueve los segmentos desde el stack hacia el registro CX para luego hacer MOV DS, CX. ¿Esto es necesario para realizar esa operación o es posible mover desde el stack directo a los registros de segmento, por ejemplo MOV DS, [BP + 6]?
3. ¿Es posible hacer comparaciones directas entre accesos a memoria indirectos, por ejemplo CMP word ptr ES:[DS], DS:[SI] y/o con inmediatos como 0/NULL?

!Desde ya muchas gracias!
En respuesta a Marco Liguori Hernandez

Re: [2022][Febrero][Problema 2]

de Federico Rivero -

Hola Marco!

Perdoná que se nos había pasado responder esto. Voy entrelíneas:

1. Para verificar si el arbol == NULL, hace un OR bit a bit entre el segmento y desplazamiento, saltando si resulta en cero esa operación. Tomando en cuenta que la posición 0 de memoria/segmento está reservada para punteros NULL, ¿no sería suficiente comparar el segmento con NULL para hacer ese chequeo?.

Tomamos NULL como la dirección física 0. Solo con comparar que el segmento sea 0 no basta para esto, ya que con segmento = 0 y desplazamiento != 0 se llega a una dirección física != 0. Por lo tanto es requerido chequear ambos segmento y desplazamiento con 0 y ambos tienen que valer 0 para que el puntero sea NULL.

2. Veo en la solución que mueve los segmentos desde el stack hacia el registro CX para luego hacer MOV DS, CX. ¿Esto es necesario para realizar esa operación o es posible mover desde el stack directo a los registros de segmento, por ejemplo MOV DS, [BP + 6]?

Es necesario! x86 solo soporta la carga a registros de segmento desde los registros de propósito general. De todos modos, no es algo que penalicemos. Si tienen dudas con respecto a las operaciones soportadas, pueden probar el código en el ArquiSim.

3. ¿Es posible hacer comparaciones directas entre accesos a memoria indirectos, por ejemplo CMP word ptr ES:[DI], DS:[SI] y/o con inmediatos como 0/NULL?

No está soportada la comparación memoria-memoria (ni otras operaciones). La instrucción mencionada por tí no es válida. Sí es válido comparar memoria con inmediato:

CMP word ptr ES:[DI],  0

Saludos, 

        Federico