Posted by : Andrés Cuaycal
sábado, 4 de abril de 2015
INSTRUCCIONES DE TRANSFERENCIA DE DATOS
Todas las instrucciones se encuentran en el set de instrucciones.Este tipo de instrucciones permiten transferir o mover datos desde una localización de memoria a un registro o viceversa, así como entre registros internos o hacia o desde los puertos del circuito. Cada instrucción especifica el modo de direccionamiento utilizado. El set de instrucciones completo se encuentra en la página de Descargas.
El las siguientes instrucciones se utilizará la siguiente nomenclatura:
Rd
|
Registro de
Destino
|
Rr
|
Registro Fuente
|
K
|
Constante
|
k
|
Dirección de memoria
|
>> Instrucción MOV, Copy Register
Esta instrucción hace la copia del contenido de un registro en otro. El registro fuente Rr, que se encuentra a la derecha de los operandos, no cambia, mientras que el registro de destino Rd es caragado con una copia de Rr.Esta instrucción permite utilizar todos los registros del microcontrolador del 0 al 31
Operación:
(Rd) ← (Rr)
Sintaxis: Operandos
MOV Rd,Rr 0 ≤ d ≤ 31, 0 ≤ r ≤ 31
Ejemplo:
mov r16,r17 ; el contenido
de R17 es copiado a R16
>> Instrucción MOVW, Copy Register Word
Esta instrucción copia el contenido de un par de registros a otro. El contenido de los registros fuente par Rr+1:Rr, no cambia.
Operación:
Rd+1:Rd ← Rr+1:Rr
Sintaxis: Operandos
MOVW Rd+1:Rd,Rr+1:Rr d {0,2,4,....}, r {0,2,4,....}
Ejemplos:
Operación:
Rd+1:Rd ← Rr+1:Rr
Sintaxis: Operandos
MOVW Rd+1:Rd,Rr+1:Rr d {0,2,4,....}, r {0,2,4,....}
Ejemplos:
movw r0,r16 ; en
R0:R1 se copia el contenido de R16:R17
movw
r3:r2,r19:r18 ; en R2:R3 se copia el contenido de R18:R19
Las dos sintaxis utilizadas son correctas, pero la primera es más corta y se obtienen los mismos resultados.
>> Instrucción LDI, Load Inmediate
Esta instrucción carga una constante de 8 bits directamente a los registros 16 a 31.
Operación:
Rd ← K
Sintaxis: Operandos
LDI Rd,K 16 ≤ d ≤ 31
Ejemplos:
Operación:
Rd ← K
Sintaxis: Operandos
LDI Rd,K 16 ≤ d ≤ 31
Ejemplos:
ldi
r18,0b00001111 ; Constante en binario cargado a R18
ldi r20,255 ;
Constante en decimal cargado a R20
ldi r21,0xFE ;
Constante en hexadecimal cargado a R21
En las siguientes intrucciones la memoria de datos consiste en los registros del archivo de trabajo, memoria I/O, la memoria SRAM interna, y el espacio extendido de I/O.
>> Intruccion LD, Load Indirect from Data Space to Register using Index X, Y, Z
Esta instrucción permite cargar un byte a un registro con direccionamiento indirecto, con o sin desplazamiento, de la memoria de datos a un registro.
El registro puntero X, Y o Z, con la operacion no cambia o puede ser post-incrementado o pre-decrementado. Esta característica es especialmente aplicada para accesos a arreglos, tablas y puntero del stack.
Operación: Comentario
(i) Rd ← (X) X: No cambia
(ii) Rd ← (X) X: Post-incremento
(iii) Rd ← X-1 X: Pre-decremento
(i) Rd ← (Y) Y: No cambia
(ii) Rd ← (Y) Y: Post-incremento
(iii) Rd ← Y-1 Y: Pre-decremento
(i) Rd ← (Z) Z: No cambia
(ii) Rd ← (Z) Z: Post-incremento
(iii) Rd ← Z-1 Z: Pre-decremento
Sintaxis: Operandos
Para el puntero X
(i) LD Rd,X 0 ≤ d ≤ 31
(ii) LD Rd,X+ 0 ≤ d ≤ 31
(iii) LD Rd,-X 0 ≤ d ≤ 31
Para el puntero Y
(i) LD Rd,Y 0 ≤ d ≤ 31
(ii) LD Rd,Y+ 0 ≤ d ≤ 31
(iii) LD Rd,-Y 0 ≤ d ≤ 31
Para el puntero Z
(i) LD Rd,Z 0 ≤ d ≤ 31
(ii) LD Rd,Z+ 0 ≤ d ≤ 31
(iii) LD Rd,-Z 0 ≤ d ≤ 31
(i) Rd ← (X) X: No cambia
(ii) Rd ← (X) X: Post-incremento
(iii) Rd ← X-1 X: Pre-decremento
(i) Rd ← (Y) Y: No cambia
(ii) Rd ← (Y) Y: Post-incremento
(iii) Rd ← Y-1 Y: Pre-decremento
(i) Rd ← (Z) Z: No cambia
(ii) Rd ← (Z) Z: Post-incremento
(iii) Rd ← Z-1 Z: Pre-decremento
Sintaxis: Operandos
Para el puntero X
(i) LD Rd,X 0 ≤ d ≤ 31
(ii) LD Rd,X+ 0 ≤ d ≤ 31
(iii) LD Rd,-X 0 ≤ d ≤ 31
Para el puntero Y
(i) LD Rd,Y 0 ≤ d ≤ 31
(ii) LD Rd,Y+ 0 ≤ d ≤ 31
(iii) LD Rd,-Y 0 ≤ d ≤ 31
Para el puntero Z
(i) LD Rd,Z 0 ≤ d ≤ 31
(ii) LD Rd,Z+ 0 ≤ d ≤ 31
(iii) LD Rd,-Z 0 ≤ d ≤ 31
Ejemplos
ld r2,X ; en
R2 se carga el dato apuntado por X
ld
r3,X+ ; en R3 se carga el dato apuntado por X, X se incrementa
ld
r4,-X ; X se decrementa, y en R4 se carga el dato apuntado por X
ld
r2,Y ; en R2 se carga el dato apuntado por Y
ld
r3,Y+ ; en R3 se carga el dato apuntado por Y, Y se incrementa
ld
r4,-Y ; Y se decrementa, y en R4 se carga el dato apuntado por Y
ld
r2,Z ; en R2 se carga el dato apuntado por Z
ld
r3,Z+ ; en R3 se carga el dato apuntado por Z, Z se incrementa
ld
r4,-Z ; Z se decrementa, y en R4 se carga el dato apuntado por Z
>> Instrucción LDD, Load Indirect from Data Space to Register using index Y, Z
Esta instrucción permite cargar un byte a un registro con direccionamiento indirecto, es muy similar a LD, pero se puede sumar un desplazamiento (q) al puntero Y, Z.
El puntero Y, Z no cambia después de la instrucción.
Operación: Comentario
Rd ← (Y+q) Y: No cambia, q: Desplazamiento
Rd ← (Z+q) Z: No cambia, q: Desplazamiento
Sintaxis: Operandos
LDD Rd,Y+q 0 ≤ d ≤ 31, 0 ≤ q ≤ 63
LDD Rd,Z+q 0 ≤ d ≤ 31, 0 ≤ q ≤ 63
Ejemplos
ldd r16,y+15 ; en R16
se carga el dato puntado por Y desplazado 15
ldd r5,z+3 ; en R5 se carga el dato puntado por Z desplazado 3
ldd r5,z+3 ; en R5 se carga el dato puntado por Z desplazado 3
>>Instrucción LDS, Load Direct from Data Space
Esta instrucción carga un byte de la memoria de datos en un registro.
Operación:
Rd ← k
Rd ← k
Sintaxis: Operandos
LDS Rd,k 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535
LDS Rd,k 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535
k: Es una dirección de memoria.
Ejemplos
.dseg ; inicio de segmento de codigo en SRAM
ram1: .byte 1 ; variable ram1
guardada en la SRAM
.cseg ; inicio de segmento de codigo en memoria de programa
lds r18,ram1 ; cargo en R18,
el contenido que se encuentra en ram1
lds r20,0xFF00 ; cargo en R20, el
contenido que se encuentra en la direccion 0xFF00
>> Instrucción ST, Store Indirect from Register to Data Space using Index X, Y, Z
Esta instrucción guarda un byte indirectamente, con o sin desplazamiento desde un registro al espacio de datos.
La localización del dato apuntada por el puntero X, Y, Z no cambia su contenido, pero puede ser modificado si se aplica un post-incremento o un pre-decremento. Esta característica es especialmente aplicada para accesos a arreglos, tablas y puntero del stack.
Operación: Comentario
(i) (X) ← Rr X: No cambia
(ii) (X) ← Rr X: Post-incremento
(iii) X-1 ← Rr X: Pre-decremento
(i) (Y) ← Rr Y: No cambia
(ii) (Y) ← Rr Y: Post-incremento
(iii) Y-1 ← Rr Y: Pre-decremento
(i) (Z) ← Rr Z: No cambia
(ii) (Z) ← Rr Z: Post-incremento
(iii) Z-1 ← Rr Z: Pre-decremento
Sintaxis: Operandos
Para el puntero X
(i) ST X,Rr 0 ≤ r ≤ 31
(ii) ST X+,Rr 0 ≤ r ≤ 31
(iii) ST -X,Rr 0 ≤ r ≤ 31
Para el puntero Y
(i) ST Y,Rr 0 ≤ r ≤ 31
(ii) ST Y+,Rr 0 ≤ r ≤ 31
(iii) ST -Y,Rr 0 ≤ r ≤ 31
Para el puntero Z
(i) ST Z,Rr 0 ≤ r ≤ 31
(ii) ST Z+,Rr 0 ≤ r ≤ 31
(iii) ST -Z,Rr 0 ≤ r ≤ 31
Ejemplos
(i) (X) ← Rr X: No cambia
(ii) (X) ← Rr X: Post-incremento
(iii) X-1 ← Rr X: Pre-decremento
(i) (Y) ← Rr Y: No cambia
(ii) (Y) ← Rr Y: Post-incremento
(iii) Y-1 ← Rr Y: Pre-decremento
(i) (Z) ← Rr Z: No cambia
(ii) (Z) ← Rr Z: Post-incremento
(iii) Z-1 ← Rr Z: Pre-decremento
Sintaxis: Operandos
Para el puntero X
(i) ST X,Rr 0 ≤ r ≤ 31
(ii) ST X+,Rr 0 ≤ r ≤ 31
(iii) ST -X,Rr 0 ≤ r ≤ 31
Para el puntero Y
(i) ST Y,Rr 0 ≤ r ≤ 31
(ii) ST Y+,Rr 0 ≤ r ≤ 31
(iii) ST -Y,Rr 0 ≤ r ≤ 31
Para el puntero Z
(i) ST Z,Rr 0 ≤ r ≤ 31
(ii) ST Z+,Rr 0 ≤ r ≤ 31
(iii) ST -Z,Rr 0 ≤ r ≤ 31
Ejemplos
st X,r2 ; el dato
apuntado por X se carga con R2
st X+,r3 ; el dato
apuntado por X se carga con R3, X se incrementa
st -X,r4 ; X se
decrementa, y el dato apuntado por X se carga con R4
st Y,r2 ; el dato
apuntado por X se carga con R2
st Y+,r3 ; el dato
apuntado por X se carga con R3, X se incrementa
st -Y,r4 ; X se
decrementa, y el dato apuntado por X se carga con R4
st Z,r2 ; el dato
apuntado por X se carga con R2
st Z+,r3 ; el dato
apuntado por X se carga con R3, X se incrementa
st -Z,r4 ; X se
decrementa, y el dato apuntado por X se carga con R4
>> Instrucción STD, Store Indirect from Register to Data Space using Index Y, Z
Esta instrucción guarda un byte indirectamente, es muy similar a ST, pero se puede sumar un desplazamiento (q) al puntero Y, Z.
El puntero Y, Z no cambia después de la instrucción.
Operación: Comentario
(Y+q) ← Rr Y: No cambia, q: Desplazamiento
(Z+q) ← Rr Z: No cambia, q: Desplazamiento
Sintaxis: Operandos
STD Y+q,Rr 0 ≤ r ≤ 31, 0 ≤ q ≤ 63
STD Z+q,Rr 0 ≤ r ≤ 31, 0 ≤ q ≤ 63
Ejemplos
std z+25,r22 ; guardo el
contenido de R22 en el byte apuntado por Z desplazado 25
>> Instrucción STS, Store Direct to Data Space
Guarda un byte de un registro en el espacio de datos.
Operación:
(k) ← Rr
Sintaxis: Operandos
STS k,Rr 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535(k) ← Rr
Sintaxis: Operandos
Ejemplos:
std y+5,r21 ; guardo el
contenido de R21 en el byte apuntado por Y desplazado 5
std z+25,r22 ; guardo el
contenido de R22 en el byte apuntado por Z desplazado 25
>> Instrucción LPM, Load Program Memory
Esta instrucción carga un byte apuntado por el registro Z en el registro de destino Rd. La memoria de programa esta organizada como palabras de 16 bits mientras que el puntero Z apunta a la dirección de un byte. El bit menos significativo (LSB) del puntero Z, selecciona o el byte bajo o el alto de la dirección apuntada.
Esta instrucción puede direccionar los primeros 64K bytes de la memoria de programa.
Operación:
R0 ← (Z)
Rd ← (Z)
Rd ← (Z) Z ← Z+1
R0 ← (Z)
Rd ← (Z)
Rd ← (Z) Z ← Z+1
Sintaxis: Operandos
LPM ninguno, R0 implícito
LPM Rd,Z 0 ≤ d ≤ 31
LPM Rd,Z+ 0 ≤ d ≤ 31
Si se utiliza la instrucción LPM sin operandos, el dato apuntado se guarda en R0, caso contrario se guarda en Rd.
Ejemplos:
LPM ninguno, R0 implícito
LPM Rd,Z 0 ≤ d ≤ 31
LPM Rd,Z+ 0 ≤ d ≤ 31
Si se utiliza la instrucción LPM sin operandos, el dato apuntado se guarda en R0, caso contrario se guarda en Rd.
Ejemplos:
lpm ; guarda el contenido apuntado por Z en R0
lpm r10,Z ; guarda el
contenido apuntado por Z en R10
lpm r18,Z+ ; guarda el
contenido apuntado por Z en R18, Z se incrementa
>> Instrucción OUT, Store Register to I/O location
Esta instrucción guarda el dato contenido en el registro Rr, en el registro del espacio específicado en entrada/salida (I/O: Pórticos, Temporizadores, Registros de Configuración, etc).
Operación:
I/O(A) ← Rr
I/O(A) ← Rr
Sintaxis: Operandos
OUT A,Rr 0 ≤ r ≤ 31, 0 ≤ A ≤ 63
OUT A,Rr 0 ≤ r ≤ 31, 0 ≤ A ≤ 63
A: Es una dirección de registro de (I/O), entrada/salida
Ejemplos:
Ejemplos:
ldi r16,0xF0 ; cargo en R16 el
valor de 0xF0
out porta,r16 ; cargo en el
PORTA (registro I/O) el contenido de R16
out
portd,r16 ; cargo en el PORTD (registro I/O) el contenido de R16>> Instrucción IN, Load an I/O location to register
Esta instrucción carga un dato del espacio de memoria de entrada/salida (I/O: Pórticos, Temporizadores, Registros de Configuración, etc) en un registro Rd.
Operación:
Rd ← I/O(A)
Rd ← I/O(A)
Sintaxis: Operandos
IN Rd,A 0 ≤ d ≤ 31, 0 ≤ A ≤ 63
A: Es una dirección de registro de (I/O), entrada/salida
IN Rd,A 0 ≤ d ≤ 31, 0 ≤ A ≤ 63
A: Es una dirección de registro de (I/O), entrada/salida
Ejemplos:
in r5,pinc ; guardo en R5
en contenido de PINC (registro I/O)
in r18,pinb ; guardo en R18
en contenido de PINC (registro I/O)
Posts Relacionados :
- Back to Home »
- Lenguaje Assembler »
- Instrucciones de Transferencia de Datos