Transferencia de datos

La instrucción de transferencia de datos por excelencia es:

MOV destino, fuente

entendiendo por fuente el contenido que se va a transferir a una determinada zona o registro de memoria denominada destino.

Esta instrucción, por tanto, nos va a permitir transferir información entre registros y memoria, memoria y registros y entre los propios registros utilizando alguno de los diferentes modos de direccionamiento. Con la instrucción MOV diremos que se pueden realizar todo tipo de movimientos teniendo en cuenta las siguientes restricciones:

1.- No se puede realizar una transferencia de datos entre dos posiciones de memoria directamente, por esta razón, siempre que queramos efectuarlas tendremos que utilizar un registro intermedio que haga de puente.

Por ejemplo, para hacer la operacion DATO1 <– DATO2, la instrucción MOV DATO2,DATO1 sería incorrecta. Lo que sí sería correcto sería utilizar el registro DX, u otro, como puente y hacer:

MOV DX,DATO1
MOV DATO2,DX

2.- Tampoco se puede hacer una transferencia directa entre dos registros de segmento. Por eso, como en el caso anterior, si fuera preciso se utilizaría un registro como puente.

3.- Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando direccionamiento inmediato, es decir, una constante, por lo que también habrá que recurrir a un registro puente cuando sea preciso.

Una instrucción util pero no imprescindible es:

XCHG DATO1, DATO2

que intercambia los contenidos de las posiciones de memoria o registros representadospor DATO1 y DATO2.

Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos hacer:

MOV AUX, AX
MOV AX, BX
MOV BX, AUX

en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar:

XCHG AX, BX

Las restricciones que presenta esta operación es que no se pueden efectuar intercambios directamente entre posiciones de memoria ni tampoco entre registros de segmento.

La instrucción XLAT tabla carga en el registro AL el contenido de la posición [BX][AL], en donde el registro BX ha de apuntar al comienzo de una tabla. Dichio de otra manera, AL hace de índice de la tabla y de almacén destino del contenido de la tabla.

Por ejemplo, el siguiente programa:

DATOS SEGMENT
TABLA DB 2,3,5,8,16,23
DATOS ENDS
CODIGO SEGMENT
MOVE BX, OFFSET TABLA ; Inicializa BX con la dirección donde comienza la tabla
MOVE AL, 5
XLAT TABLA
CODIGO ENDS

hace que al final el contenido de AL se 16 ya que es el 5to. elemento de la tabla y AL antes de XLAT TABLA contenia el valor 5.

Para finalizar con las instrucciones de transferencia veremos un grupo de tres instrucciones:

– LEA o cargar dirección efectiva.
– LDS o cargar el puntero en DS.
– LES o cargar el puntero en ES.

denominadas de transferencia de direcciones.

La primera, LEA, carga el desplazamiento u OFFSET correspondiente al operando fuente en el operando destino. Por ejemplo, la instrucción MOVE BX, OFFSET TABLA del ejemplo anterior sería equivalente a LEA BX, TABLA.

La segunda, LDS, se utiliza para cargar el valor del segmento de una variable en el registro DS y el desplazamiento correspondiente en el registro o posición de memoria indicada en la instrucción. Por ejemplo, la instrucción LDS BX, NUM1 haría esquemáticamente lo siguiente:


La tercera y ultima de las instrucciones, LES, es similar a LDS, con la única salvedad de que el valor del segmento se carga sobre el registro de segmento ES en vez del DS.