2 Puertos paralelo
T0Iclk = 20MHz
4 Instrucciones para realizar operaciones aritméticas
Los flags se actualizan de acuerdo con el resultado de la operación: N y Z para negativo y cero, C para el acarreo y V para cambios en el bit de signo.
4.1 ADD y ADDB
Sirve para sumar dos números en, guardando el resultado en el primero. La forma estándar de la instrucción ADD es:
ADD op1, op2 ; op1 <- op1 + op2
MOV R0,#0x0001
MOV 0xFA00,R0
ADD R0,#0x0009
ADD 0xFA00,R0
Figura 20: Ejemplo de ADD. Finalmente R0 = 0x000A y 0xFA00 = 0x000B
El conjunto de modos de direccionamiento queda bastante restringido con respecto a la instrucción MOV. Los modos que se pueden usar son:
ADD Rx, Ry
ADD Rx, [Ry] ; Ry con y = 0..3 ADD Rx, [Ry+] ; Ry con y = 0..3
75
ADD Rx, #data ADD reg, #data ADD reg, mem ADD mem, reg
La instrucción ADD admite la variante ADDB para operandos a nivel de byte.
MOV R0,#0x0001
ADDB Rh0,#0x01
Figura 21: Ejemplo de ADDB. Finalmente R0 = 0x0101
4.2 SUB y SUBB
La instrucción SUB sirve para restar dos números. Admite las mismas variantes que la instrucción ADD. (En este caso el flag de carry C, recoge el borrow. El borrow está a 1 cuando el minuendo es menor que el substraendo).
SUB op1, op2 ; op1 <- op1 – op2
MOV R0,#0x01FF
MOV 0xFA00,R0
SUB R0,#0x0009
ADD 0xFA00,R0
Figura 22: Ejemplo de SUB. Finalmente R0 = 0x1F6 y (0xFA00) =0x3F5
A nivel de byte
MOV R0,#0x01FF
SUBB Rh0,#0x01
Figura 23: Ejemplo de SUB. Finalmente R0 = 0xFF
4.3 NEG
La instrucción NEG sirve para obtener el complemento a dos de un número. Es equivalente a restar el operando op1 de 0 y almacenar el resultado en el mencionado operando (en este caso el flag de C también recoge el borrow).
Sistemas Electrónicos Digitales.
76
MOV R0,#0x01FF
NEG R0
Figura 24: Ejemplo de NEG. Finalmente R0 = 0xFE01
A nivel de byte
MOV R0,#0x01FF
NEGB Rl0
Figura 25: Ejemplo de NEGB. Finalmente R0 =0x0101
4.4 MUL y MULU
Son instrucciones para realizar multiplicaciones de dos números. Admiten dos variantes: con y sin signo.
MUL Rx,Ry ; [MDH, MDL] <- Rx * Ry MULU Rx,Ry
La instrucción MUL admite dos registros como operandos. El resultado viene dado en 32 bits, que se almacena en el registro MD (registro Multiply/Divide de la CPU, almacenando en MDL la parte baja de MD, y en MDH la parte alta de MD). En esta operación nunca se tiene rebose (C = 0). El flag V se pone a 1 si el resultado no cabe en 16 bits (útil si se pretende multiplicar el resultado de este primer producto por algún otro factor.) Los flags Z y N se actualizan de acuerdo con el valor del resultado. La instrucción MULU es la variante para operandos sin signo.
MOV R0,#0xFFFF MOV R1,#0xFFFF MUL R0,R1 MOV R2,MDL MOV R3,MDH MULU R0,R1
Figura 26: Ejemplo de MUL y MULU. Finalmente R2 = 1, R3 = 0, MDL = 0x0001 y MDH = 0xFFFE
4.5 DIV y DIVU
La instrucción DIV divide la parte baja del registro MD (MDL: 16 bits) entre el operando Rx (también de 16 bits).
DIV Rx ;MDL <- MDL / Rx MDH <- MDL mod Rx DIVU Rx
77 El cociente viene dado en 16 bits que se almacenan en la parte baja del registro MD (MDL), el resto queda en la parte alta (MDH). Caso de que el cociente supere los 16 bits significativos, o el cociente sea 0, el bit V se pone a 1. La variante DIVU opera con números sin signo. MOV R3,#0xFFFF MOV MDL,R3 MOV R0,#0x0001 DIV R0 MOV R1,MDL MOV R2,MDH MOV R3,#0xFFFF MOV MDL,R3 DIVU R0
Figura 27: Ejemplo de DIV y DIVU. Finalmente R1 = 0xFFFF, R2 = 0, MDL = 0xFFFF y MDH = 0
5 Instrucciones para realizar operaciones lógicas
Las operaciones lógicas trabajan bit a bit dentro de un registro. Se suelen usar para aplicar "máscaras", una especie de filtro que permite seleccionar ciertos bits de un registro.
Todas ellas actualizan únicamente los flags N y Z. Si el resultado es cero se pone a uno el flag Z y si el resultado es negativo se pone a uno el flag N.
5.1 AND
Se utiliza para efectuar el producto lógico de dos operandos, bit a bit. La instrucción AND admite la forma:
AND Rx,op ; Rx <- Rx and op
Admite los mismos modos de direccionamiento que la instrucción ADD. Los flags V y C quedan a 0 y el resto (A, N) se actualizan de acuerdo con el valor del resultado. La variante ANDB opera a nivel de byte.
MOV R0,#0x0001
AND R0,#0x0009
Figura 28: Ejemplo de AND. Finalmente R0 = 1
La instrucción AND sirve como máscara, para seleccionar únicamente ciertos bits de un registro o para borrar bits de forma selectiva.
Sistemas Electrónicos Digitales.
78
AND R0,#0xFFFD
Figura 29: Se quiere poner el bit 1 del registro R0 a 0. O lo que es lo mismo, se seleccionan el resto de bits del registro R0
5.2 OR
Se usa para efectuar la suma lógica de dos operandos, bit a bit. La instrucción OR admite la forma:
OR Rx, op ; Rx <- Rx or op
Admite los mismos modos de direccionamiento que la instrucción ADD. La variante ORB opera a nivel de byte.
MOV R0,#0x0001
OR R0,#0x0009
Figura 30: Ejemplo de OR. Finalmente R0 =9
La instrucción OR sirve como máscara, para seleccionar únicamente ciertos bits de un registro o para poner a uno ciertos bits de forma selectiva.
OR R0,#0x0002
Figura 31: Se quiere poner el bit 1 del registro R0 a 1. O lo que es lo mismo, se seleccionan el resto de bits del registro R0
La combinación de AND con OR permite igualar dos bits de dos registros.
AND R0,#0xFFFD ; se pone a 0 el bit 1 de R0
MOV R2,R1 ; para no modificar R1
AND R2,#0x0002 ; se selecciona el bit 1 de R2
OR R0,R2 ; R0.1 = R2.1 = R1.1
Figura 32: Se quiere poner el bit 1 del registro R0 igual que el bit 1 del registro R1.
5.3 XOR
Realiza un OR EXCLUSIVO bit a bit de dos operandos. La instrucción XOR admite la forma: XOR Rx, op ; Rx <- Rx xor op
79
MOV R0,#0x0101
XOR R0,#0xFFFF ; R0 <- 0xFEFE Figura 33: Ejemplo de XOR. Finalmente R0 = 0xFEFE
5.4 CPL
Realiza el complemento a 1 de un número. La instrucción CPL admite la forma: CPL Rx ; Rx <- complemento a 1 de Rx
La variante CPLB opera a nivel de byte.
MOV R0,#0x0101
CPL R0 ; R0 <- 0xFEFE Figura 34: Ejemplo de CPL. Finalmente R0 = 0xFEFE