• No se han encontrado resultados

Instrucciones para realizar operaciones aritméticas

In document SISTEMAS ELECTRÓNICOS DIGITALES (página 75-80)

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

In document SISTEMAS ELECTRÓNICOS DIGITALES (página 75-80)

Documento similar