Practico 9, ejercicio 2, esta bien esta solucion?

Practico 9, ejercicio 2, esta bien esta solucion?

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 6

Buenas, ando un poco entreverado con este tema y por eso pongo mi solucion para ver si no me equivoque en algo, agradezco cualquier comentario y/o sugerencia, gracias!

PD: No tuve en cuenta el caso que entre D1 y D2 no hayan N bytes porque ni siquiera se si esta bien la solucion.

Copiar PROC

XOR SI, SI; Inicializo iterador

PUSH AX; Voy a re-utilizar AX en el While, por eso "guardo el contexto"

While:

CMP CX, SI

JE Fin

MOV ES:[BX+SI], AX; D2+iterador = D1+iterador, la primera vez iterador es 0

INC SI; iterador++

PUSH BX

MOV BX, AX; Guardo en BX el valor de AX para poder hacer ES:[BX+SI]

MOV AX, ES:[BX+SI]

POP BX

JMP While

Fin:

POP AX

RET

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 9, ejercicio 2, esta bien esta solucion?

de Gustavo Brown -

Hola, 

  No está correcto porque estas copiando de a palabra y el problema habla de bytes, las instrucciones de acceso a memoria parecen intercambiadas (primero copia y luego lee). Deberias primero leer de memoria a un registro de 8 bits, luego copiar en destino desde ese registro. 

También falta guardar parte del contexto (SI).

Lo ideal en este caso (para evitar PUSH y POPs en el bucle) es utilizar BP como segundo "puntero".

Si bien el ejercicio no lo pide ni lo indica, podrían también tener en cuenta el caso en que los buffers a copiar están solapados.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 9, ejercicio 2, esta bien esta solucion?

de Hugo Sebastian Rodriguez Reyes -

Pongo comentarios para ver si entendi lo que me planteas:

Copiar PROC

XOR SI, SI; Inicializo iterador

MOV BP, AX; Uso BP como segundo "puntero".

While:

CMP CX, SI

JE Fin

MOV AL, ES:[BP+SI]; Guardo en un registro de 8 bits D1+iterador. Leo de memoria a un registro de 8 bits.

MOV ES:[BX+SI], AL; D2+iterador = D1+iterador, la primera vez iterador es 0. Copia en destino desde ese registro.

INC SI; iterador++

JMP While

Fin:

RET

No estoy seguro de que pueda hacer MOV BP, AX, ya que uno es un puntero a una pila y el otro es un acumulador de 16 bits. Estoy errado?

PD: No contemple la sugerencia de tener en cuenta que los buffers a copiar esten solapados.

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 9, ejercicio 2, esta bien esta solucion?

de Gustavo Brown -

Perfecto. 

AX y BP son registros de 16 bits y se puede copiar el contenido de uno a otro.

Yo le agregaría al comienzo

  PUSH SI
  PUSH BP
  

y antes del RET:
  MOV AX, BP
  POP BP
  POP SI

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 9, ejercicio 2, esta bien esta solucion?

de Hugo Sebastian Rodriguez Reyes -

Entiendo que los dos PUSH son porque en un principio quizas haya informacion util en los registros SI y BP, por eso se guarda el contexto, pero no me doy cuenta porque antes del RET copias en AX el contenido del registro BP, ya que AX nunca lo modifique o sea que al finalizar el procedimiento tiene su valor inicial.

Sera que no me estoy dando cuenta algo?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 9, ejercicio 2, esta bien esta solucion?

de Gustavo Brown -

Ese mov esta porque estás pisando AL que es la parte baja de AX. Como al principio copiaste AX en BP, por eso al final lo puedo restaurar desde BP.

Saludos,

    Gustavo