Autor Tema: Duda AND vs. ANDS  (Leído 408 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
Duda AND vs. ANDS
« en: 10 de Enero de 2017, 06:44:30 »
Hola,

no entiendo bien la diferencia entre una instrucción AND y una instrucción ANDS. Por lo que he visto, el sufijo 'S' lo que hace es actualizar los flags de condición al final de la operación, o algo así... No entiendo a que se refiere esto, ¿cuál sería la diferecia entre hacer: (1001 AND 1000) y (1001 ANDS 1000)?

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5632
Re:Duda AND vs. ANDS
« Respuesta #1 en: 10 de Enero de 2017, 13:20:24 »
Que microcontroladores estamos hablando y que lenguaje de programación, por lo que decís parece ASM de un ARM.

EDITO:

Si parece ser ARM y es la notacion que usa. ALGUNAS (no todas) las arquitecturas soporta el uso de estas 2 instrucciones, ambas son IDENTICAS. Es decir:

(1001 AND 1000)  = 1000
(1001 ANDS 1000) = 1000

La unica diferencia que todo lo que tenga una S al final, ocurre lo mismo con ADD y ADDS entre otras. Los que poseen la S actualizan las banderas de estado.
Suponete que veniamos haciendo instrucciones ( voy a usar numeros en ves de registros en algunos lugares para que se note la diferencia)

Banderas de estado antes de cada par de instrucciones: Z= 0, C=0

ADD   R0, 0x8000.0000, 0x8000.0000                   ; Es decir sumo 1000........ a 1000...... (son 32 bits) esto deberia poner el Carry a 1, pero como no tiene la S no actualiza las banderas
ADDS   R0, 0x8000.0000, 0x8000.0000                 ; Aca si pone el C = 1

AND     R0, 0b1000, 0b0001                                 ; En este caso la bandera Z deberia ponerse en 1, pero no lo hace por que le falta la S
ANDS    R0, 0b1000, 0b0001                                ; Aca si se pone a 1.

Como decia algunas arquitecturas soportan esto en toda la gama de instrucciones, mas que nada aquellas que soportan Thumb-2, las que soportan solo Thumb que son instrucciones de 16bits tienen algunas instrucciones de esta forma, la mayoria de las instrucciones existe una sola y es con la S al final si o si.

Podes ver la diferencia en estos cheatsheet:
Thumb
https://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARM_QRC0006_UAL16.pdf
ARM & Thumb-2
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
« Última modificación: 10 de Enero de 2017, 14:10:05 por KILLERJC »

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
Re:Duda AND vs. ANDS
« Respuesta #2 en: 10 de Enero de 2017, 15:42:11 »
Perfecto, lo he entendido 8)

Me olvidé comentar que era una arquitectura ARM.

Efectivamente la S se puede añadir a varias instrucciones, no sólo a la AND. También a la SUB(S), ADD(S), etc.

La duda me surgió haciendo el siguiente ejercicio:

    Escribe este pseudo-código en C en ensamblador:

Código: C
  1.     if (R12 % 2 == 0)
  2.     {
  3.         R0 = 'E';
  4.     }
  5.     else
  6.         R0 = 'O';

La respuesta es la siguiente:

        LDR R0, =1
        ANDS R12, R0
        BNE impar
        LDR R0, ='E'
        B fin
    impar:
        LDR R0, ='O'
    fin:


Ahora comprendo que si R12 es impar, Z=0. Por lo tanto BNE efectuará el salto.

En cambio si es par, Z=1. Por lo tanto BNE no efectuará el salto.

En realidad, el problema que tenía es que no comprendía bien el funcionamiento de la instrucción AND. Pensaba que hacía AND bit a bit y luego hacía un AND con todos los bits resultantes... Se me fue la olla jeje

Pensaba que era la instrucción ANDS que hacía algo extraño...

Muchas gracias por tu ayuda!!

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 5632
Re:Duda AND vs. ANDS
« Respuesta #3 en: 10 de Enero de 2017, 18:58:55 »
Si es una simple forma de detectar si es par o impar. solamente revisando el bit de menor peso, ya que todos los demas son multiplos de 2, excepto el primero que es 1.

Es mas la instruccion AND la sintaxis es :

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

donde
op = AND
cond = no se usaria aca
RD = Registro destino ( opcional )
Rn = Registro a usar
Operand2 = Operador flexible, puede ser un inmediato de 8 bits, otro Rn, o shift de algun Rn.

Asi que podrias resumirlo en:

Código: ASM
  1. ANDS R12, #1

---------

Luego no se si es necesario usar ='O' ya que si no mal recuerdo el = genera un acceso indirecto, es decir lo guarda en la memoria de programa (flash), por ser simplemente valores de pocos bits tal ves puedas cargarlo con un MOV Rn,#Lit.

Esto es simplemente eficiencia (tamaño y velocidad) pero no cambia el resultado.

Y si aun asi queres mas velocidad, suponiendo que lo anterior lo del MOV funcione, imagino que esto deberia funcionar, y que la arquitectura soporte obviamente la instruccion IT, podes evitar los saltos.

Código: ASM
  1. ANDS R12, #1
  2. ITE NE
  3. MOVNE R0,#'E'
  4. MOVEQ R0,#'O'
« Última modificación: 10 de Enero de 2017, 21:20:40 por KILLERJC »

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
Re:Duda AND vs. ANDS
« Respuesta #4 en: 11 de Enero de 2017, 10:26:44 »
Okey, me quedó claro. Muchas gracias!!