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 = дополнение Rn до единицыbic(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.