[2015][Febrero][Problema 2]

[2015][Febrero][Problema 2]

de Agustina Sierra Lima -
Número de respuestas: 3

Buenas,

tengo una duda de la parte a de este ejercicio.

La matriz de variables de tipo short, que se ubica en memoria por filas (es decir, primero en memoria el valor MATRIZ[0][0], luego MATRIZ[0][1], así hasta completar la primer fila y luego MATRIZ[1][0], MATRIZ[1][1], etc).

No me queda claro en la solución la siguiente parte:

;armo en AX el offset hasta MATRIZ[i][0]

MOV AX, SI ; AX = i

PUSH DX; preservo DX porque se modifica en la multiplicación de 16 bits

MUL DX

-------- Por que el resultado quedaría en AX? si multiplico cosas de 16 bits el resultado queda en DX:AX---------------

POP DX ----Aca esta sobrescribiendo parte de la multiplicacion.

SHL AX, 1  -----No tendria que ser SHR? no entiendo que habria que multiplicarlo por dos.

ADD AX, DI

ADD AX, DI ---Porque suma dos veces DI?


Yo lo resolví de una forma distinta, se que cada fila de la matriz ocupa 2*largo Bytes. Y mantengo BX apuntando a el inicio de cada fila oses Matriz[i][0]. Entonces para acceder a Matriz[i][j] hago : 

Mov Di , CX ; CX tiene el valor de j

SHR Di, 1

Entonces ES:[BX+DI] tiene Matriz[i][j] y cuando se cumple que CX es igual a DX osea j igual a largo tengo que incrementar i y mover BX a la siguiente fila y eso lo hago:

Mov Di,DX; Di=largo

SHR Di,1; Di=2*largo

ADD BX,Di; muevo BX a Matriz[i][0]

Esto esta mal?


Gracias

En respuesta a Agustina Sierra Lima

Re: Problema 2 examen febrero 2015

de Federico Rivero -

Estimada, 

-------- Por qué el resultado quedaría en AX? si multiplico cosas de 16 bits el resultado queda en DX:AX---------------

La solución asume que largo es un número suficientemente chico como para que esa multiplicación no se extienda a 32 bits (es decir, la multiplicación siempre se devuelve en DX y AX, pero si DX es suficientemente chico, el resultado en DX es 0). En el examen se aclaró que largo = 128 para todo el ejercicio.

-------- SHL AX, 1  -----No tendria que ser SHR? no entiendo que habria que multiplicarlo por dos.

No entendí bien lo que dijiste, pero SHL, 1 es multiplicar por 2 y SHR 1 es dividir entre dos. Me parece que te estás confundiendo ahí porque en tu solución tenés un SHR y luego un comentario 2 * largo.

-------- ADD AX, DI ---Por qué suma dos veces DI?

Lo suma dos veces porque j es un índice dentro de la matriz, pero como la matriz es de shorts, cada posición de la matriz ocupa 2 bytes. Por esta razón, para realizar la traducción de índice a dirección de memoria es necesario multiplicar por 2 (o sumar 2 veces, que es lo mismo)


Con respecto a tu solución, dejando de lado el error del SHR (debería ser SHL), está bien!

Saludos,

            Federico





En respuesta a Federico Rivero

Re: Problema 2 examen febrero 2015

de Leandro Ezequiel Dominguez Perez -
Hola Federico, me queda una duda con respecto a la solución:
Para direccionar la posición matriz[i][j], ¿no debería acceder a es:bx[ largo*2*i + 2*j ]?. Llego a esto entendiendo que cada entrada de la matriz ocupa 2bytes por ser un short.
Desde ya gracias por la aclaración :).
Saludos