4. Логічні та побітові інструкції¶
4.1. Конвенції документа¶
Позначення: Rd, Rn позначають регістри ARM R0-R7, за винятком спеціальних інструкцій, де можуть використовуватись R0-R15. Rn<a-b> позначає регістр ARM, вміст якого повинен знаходитися в діапазоні a <= contents <= b. Для інструкцій з двома аргументами-регістрами допустимо, щоб вони були однаковими. Наприклад, наступне обнулить R0 (Python R0 ^= R0) незалежно від його початкового вмісту.
eor(r0, r0)
Ці інструкції впливають на прапорці умов, якщо не вказано інше.
4.2. Логічні інструкції¶
and_(Rd, Rn)
Rd &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffтобто Rd = доповнення до одиниці від Rnbic(Rd, Rn)
Rd &= ~Rnпобітове очищення Rd за маскою в Rn
Зверніть увагу на використання «and_» замість «and», оскільки «and» є зарезервованим ключовим словом в Python.
4.3. Інструкції зсуву та обертання¶
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> RnЛогічний зсув вправоasr(Rd, Rn<1-32>)
Rd >>= Rnарифметичний зсув вправоror(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)Rd обертається вправо на Rn бітів.
Обертання на (наприклад) три біти працює наступним чином. Якщо Rd початково містить біти b31 b30..b0, після обертання він міститиме b2 b1 b0 b31 b30..b3
4.4. Спеціальні інструкції¶
Коди умов не змінюються цими інструкціями.
clz(Rd, Rn)
Rd = count_leading_zeros(Rn)
count_leading_zeros(Rn) повертає кількість двійкових нульових бітів перед першим двійковим одиничним бітом у Rn.
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) повертає побітово обернений вміст Rn. Якщо Rn містить біти b31 b30..b0, Rd буде встановлено в b0 b1 b2..b31
Кінцеві нулі можуть бути підраховані шляхом виконання побітового обертання перед виконанням clz.