Herramientas de usuario

Herramientas del sitio


arm_inst_logicas

¡Esta es una revisión vieja del documento!


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.

× iphelper toolbox

you see this when javscript or css is not working correct

Untested
IP Address:
First usable:
Subnet:
Last usable:
CIDR:
Amount of usable:
Network address:
Reverse address:
Broadcast address:

arm_inst_logicas.1590124813.txt.gz · Última modificación: 2020/05/22 05:20 (editor externo)