Instrucciones Lógicas

AND, ORR, EOR, BIC, and ORN

Instrucciones Lógicas AND, OR, Exclusive OR, Bit Clear, and OR NOT. Las instrucciones AND, EOR y ORR realizan operaciones AND, OR exclusivas y OR a nivel de bits en los valores de Rn y Operando 2

La instrucción BIC (Bit Clear) realiza una operación AND en los bits en Rn con los complementos de los bits correspondientes en el valor de Operando 2.

La instrucción ORN Thumb realiza una operación OR en los bits en Rn con los complementos de los bits correspondientes en el valor de Operando 2.

En ciertas circunstancias, el ensamblador puede sustituir BIC por AND, AND por BIC, ORN por ORR u ORR por ORN. Tengamos esto en cuenta al leer vuelco de memoria.

Sintaxis General:

op{S}{cond} Rd, Rn, Oper2

op es una de las siguientes instrucciones:

AND Y lógico.

ORR O Lógico.

EOR O Lógico exclusivo.

BIC Y Lógico negado.

ORN O Lógico negado.

AND

AND realiza un AND lógico a nivel de bit entre dos valores. El primer valor proviene de un registro. El segundo valor puede ser un valor inmediato o un registro, y se le puede aplicar un shift antes de la operación AND. AND puede actualizar opcionalmente los flags en función del resultado

Sintaxis

AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

Donde

<cond> Es la condición bajo la cual se ejecuta la instrucción. Si se omite <cond>, se usa la condición AL (siempre).

S Hace que la instrucción actualize el CPSR en base al resultado de la instrucción. Si se omite S, la instrucción no cambia el CPSR.

<Rd> Especifica el registro de destino.

<Rn> Especifica el registro que contiene el primer operando.

<shifter_operand> Especifica el segundo operando. Puede ser un #<immediate> (inmediato de 8 bits), un registro ó un registro con shift

Como se modifican los flags:

if S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out= C Flag anterior (para el caso de direccionamiento a registro)
V Flag = no es afectado

Uso:

AND se usa para extraer un campo de un registro, haciendo AND al registro con un valor de máscara que tiene 1s en el campo a extraer y 0s en otros lugares.

Ejemplo:

.data
valor: .word 0xaaaaaaaa
mascara: .word 0xf0000000
.text
.global main
main:
ldr r1, =valor
ldr r1, [r1]	//r1=0xaaaaaaaa
ldr r0, =mascara
ldr r0, [r0]	// r0=0xf0000000
ands r2, r1, r0	//r2=r1 and r0 = 0xa0000000
//bits NZCV de cpsr pasan de 0x6 (0110) a 0xa (1010)
fin:
mov r7, #1	// Salida al sistema
swi 0

Ejercicio: Repetir el código anterior partiendo de un registro cpsr con los bits NZCV en 0. Verificar que el valor del carry flag C se mantiene después de la instrucción AND.