4. Instrukcje logiczne i bitowe#
4.1. Konwencje dokumentu#
Notacja: Rd, Rn oznaczają rejestry ARM R0-R7 z wyjątkiem instrukcji specjalnych, gdzie można używać R0-R15. Rn<a-b> oznacza rejestr ARM, którego zawartość musi mieścić się w zakresie a <= contents <= b. W przypadku instrukcji z dwoma argumentami rejestrowymi dopuszczalne jest, aby były one identyczne. Na przykład poniższe wyzeruje R0 (w Pythonie R0 ^= R0) niezależnie od jego początkowej zawartości.
eor(r0, r0)
Te instrukcje wpływają na flagi warunku, z wyjątkiem przypadków, gdy stwierdzono inaczej.
4.2. Instrukcje logiczne#
and_(Rd, Rn)
Rd &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xfffffffftzn. Rd = dopełnienie jedynkowe Rnbic(Rd, Rn)
Rd &= ~Rnwyczyść bity Rd używając maski w Rn
Należy zwrócić uwagę na użycie „and_” zamiast „and”, ponieważ „and” jest zarezerwowanym słowem kluczowym w Pythonie.
4.3. Instrukcje przesunięcia i rotacji#
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> RnLogiczne przesunięcie w prawoasr(Rd, Rn<1-32>)
Rd >>= Rnarytmetyczne przesunięcie w praworor(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)Rd jest rotowany w prawo o Rn bitów.
Rotacja o (na przykład) trzy bity działa w następujący sposób. Jeśli Rd początkowo zawiera bity b31 b30..b0, po rotacji będzie zawierać b2 b1 b0 b31 b30..b3
4.4. Instrukcje specjalne#
Te instrukcje nie wpływają na kody warunku.
clz(Rd, Rn)
Rd = count_leading_zeros(Rn)
count_leading_zeros(Rn) zwraca liczbę binarnych bitów zerowych przed pierwszym binarnym bitem jedynkowym w Rn.
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) zwraca zawartość Rn z odwróconą kolejnością bitów. Jeśli Rn zawiera bity b31 b30..b0, Rd zostanie ustawione na b0 b1 b2..b31
Końcowe zera można policzyć, wykonując odwrócenie bitów przed wykonaniem clz.