TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: mojo 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.
-
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
-
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:
if (R12 % 2 == 0)
{
R0 = 'E';
}
else
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
-
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:
---------
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.
ANDS R12, #1
ITE NE
MOVNE R0,#'E'
MOVEQ R0,#'O'
-
Okey, me quedó claro. Muchas gracias!!