Practico 3 Ejercicio 3

Practico 3 Ejercicio 3

de Augusto Alonso Novo -
Número de respuestas: 8

Hola! En la letra del ejercicio dice que las direcciones de memoria D1 y D2 se encuentran en AX y BX respectivamente. Ademas dice que "las direcciones de memoria son desplazamientos con respecto al registro ES".

¿Esto significa que en [AX] tengo el valor de desplazamiento y para poder pararme en el lugar que se encuentra el dato debo hacer MOV ES, [AX] ? 

En respuesta a Augusto Alonso Novo

Re: Practico 3 Ejercicio 3

de Gustavo Brown -

Augusto,

No significa eso. Por un lado no se puede cargar un registro de segmento a partir del contenido de una dirección de memoria con MOV. Por otro, el registro AX no puede utilizarse para direccionar memoria. 

La idea del ejercicio es copiar N bytes (N almacenado en el registro CX) desde la dirección segmentada ES:AX hacia la dirección segmentada ES:BX

Tenes que tener cuidado con cuáles registros usas para direccionar memoria, en particular no vas a poder utilizar AX, pero podrías utilizar BX y copiar el contenido de AX en SI o DI para poder direccionar el otro "buffer".

Te recomiendo siempre escribir primero el algoritmo pedido en C y luego "ensamblarlo" a 8086. 

Saludos,

     Gustavo

En respuesta a Gustavo Brown

Re: Practico 3 Ejercicio 3

de Augusto Alonso Novo -

Buenas! Tomando en cuenta tu respuesta y leyendo un poco mas sobre los registros y assembler, hice el siguiente algoritmo:

copiar proc
mov si, ax ;copio el desplazamiento que esta en ax, a si
mov di, 0 ;voy a usar di como contador
condWhile:
   cmp di, cx ;comparo di con el valor alojado en cx (N)
   je finWhile ;si son iguales, ya copie todos los elementos
   mov dx, es:[si] ;copio en dx lo que esta en es:ax
   mov es:[bx + si], dx ;copio lo que estaba en es:ax a es:bx
   add si, 1 ;me muevo un lugar de la direccion es:ax ***
  
add di, 1 ;le agrego uno al contador
   jmp condWhile
finWhile:
   ret
copiar endp

Esto sería correcto?

En respuesta a Augusto Alonso Novo

Re: Practico 3 Ejercicio 3

de Gustavo Brown -

Augusto,
  Tenes algunos problemas en el movimiento de memoria.

Por un lado, a priori deberias mover bytes no palabras, podrías utilizar DL por ejemplo en vez de DX.

Luego estás generando mal la direccion de destino. Fijate que pusiste como desplazamiento BX+SI, pero SI arranca con el desplazamiento de la "fuente" (AX), seguramente quisiste usar DI allí.

Los comentarios de los MOV que mueven memoria estan mal, no estas copiando lo que está en ES:AX a DX ni lo que estaba en ES:AX a ES:BX porque te estas "moviendo" por el buffer.

Por otro lado, este problema se puede intentar resolver "bien-bien" en el sentido de que funcione incluso si los buffers están solapados. Te sugiero en todo caso que armes primero el alto nivel y luego lo ensambles a mano a 8086; y también es buena idea que lo pruebes en el ArquiSim, allí seguramente hubieras identificado algunos de los problemas que mencioné.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 3 Ejercicio 3

de Augusto Alonso Novo -

Efectivamente estaba poniendo mal la direccion de destino. Es DI en lugar de SI.

Cuando decis que "Los comentarios de los MOV que mueven memoria estan mal, no estas copiando lo que está en ES:AX a DX ni lo que estaba en ES:AX a ES:BX porque te estas "moviendo" por el buffer", no se supone que me tengo que ir moviendo de a uno para copiar el byte que quiero? Parto de ES:AX y avanzo un lugar. Copio el byte en DX, copio lo que esta en DX a ES:BX y repito hasta haber copiado los N elementos. 

Perdón por la insistencia pero como dijeron que era un tema complicado quiero que me quede claro...

En respuesta a Augusto Alonso Novo

Re: Practico 3 Ejercicio 3

de Gustavo Brown -

Augusto,

  Esta bien el código, tenes que irte moviendo por el buffer. 

 Lo que yo decía del comentario es que el código no está haciendo lo que dice el comentario, porque vos vas cambiando SI y DI pero AX y BX quedan fijos, por lo tanto ya no estas copiando lo que esta en ES:AX a DL y de DL a ES:BX.

Saludos,
  Gustavo

En respuesta a Gustavo Brown

Re: Practico 3 Ejercicio 3

de Donato Aguirre Reyes -

Hola, no me queda muy claro que representaría este problema en alto nivel. 

Sería algo así como copiar N digitos de un array de bytes a otro? Gracias