¡Esta es una revisión vieja del documento!
Tabla de Contenidos
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.
==== ORR ==== (pagina 234) 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.
you see this when javscript or css is not working correct