¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Instrucciones Lógicas
Resumen de AND, ORR, EOR, BIC, y 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.
ORR
ORR (OR lógico) realiza un OR bit a bit (inclusive) entre dos valores. El primer valor proviene de un registro. El segundo valor puede ser un valor inmediato, un registro ó un registro con shift. ORR puede actualizar opcionalmente los flags en función del resultado
Sintaxis
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
Donde los operandos y los componentes opcionales de la instruccion se comportan como en la instrucción AND. En particular:
<shifter_operand> Especifica el segundo operando. Puede ser un #<immediate> (inmediato de 8 bits), un registro ó un registro con shift
Los flags se modifican igual que en la Instruccion AND.
Uso: Se usa ORR para setear los bits seleccionados en un registro. Para cada bit, OR con 1 setea el bit, y OR con 0 lo deja sin cambios
Ejemplo:
orrs r2, r1, r0 //r2=r1 or r0
Ejercicio: Reciclar el ejemplo de AND para setear en 1 los 8 bits más significativos del registro r1 y almacenarlo en r2. Verificar los valores intermedios con gdb.
EOR
EOR (OR exclusivo) realiza un OR exclusivo bit a bit entre dos valores. El primer valor proviene de un registro. El segundo valor puede ser un valor inmediato, un registro ó un registro con shift. ORR puede actualizar opcionalmente los flags en función del resultado
Sintaxis
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
Donde los operandos y los componentes opcionales de la instruccion se comportan como en la instrucción AND.
Los flags se modifican igual que en la Instruccion AND.
Uso: Se usa EOR para invertir los bits seleccionados en un registro. Para cada bit, EOR con 1 invierte ese bit, y EOR con 0 lo deja sin cambios.
Se puede usar para encriptar el contenido de un registro. Para desencriptar el contenido del registro basta aplicar xor nuevamente.
Ejemplo:
.data valor: .word 0x12345678 clave: .word 0xf0f0f0f0 .text .global main main: ldr r1, =valor ldr r1, [r1] //r1=0x12345678 ldr r0, =clave ldr r0, [r0] // r0=0xf0f0f0f0 eors r2, r1, r0 //r2 = r1 xor r0 = 0xa0000000 (r1 encriptado) eors r3, r2, r0 //r3 = r1 fin: mov r7, #1 // Salida al sistema swi 0
Ejercicio: Modificar el ejemplo anterior para invertir los 8 bits más significativos y los 8 bits menos significativos del registro r1 y almacenarlo en r2. Verificar que aplicando xor se recupera el valor original de r1.
you see this when javscript or css is not working correct