4. Instruções lógicas e de bits¶
4.1. Convenções do documento¶
Notação: Rd, Rn denotam registos ARM R0-R7, exceto no caso das instruções especiais onde podem ser utilizados R0-R15. Rn<a-b> denota um registo ARM cujo conteúdo deve estar no intervalo a <= contents <= b. No caso de instruções com dois argumentos de registo, é permitido que sejam idênticos. Por exemplo, o seguinte zerará R0 (Python R0 ^= R0) independentemente do seu conteúdo inicial.
eor(r0, r0)
Estas instruções afetam os flags de condição, exceto onde indicado.
4.2. Instruções lógicas¶
and_(Rd, Rn)
Rd &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffi.e. Rd = complemento para 1 de Rnbic(Rd, Rn)
Rd &= ~Rnlimpar bits de Rd usando a máscara em Rn
Note a utilização de «and_» em vez de «and», porque «and» é uma palavra reservada em Python.
4.3. Instruções de deslocamento e rotação¶
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> RnDeslocamento lógico para a direitaasr(Rd, Rn<1-32>)
Rd >>= Rndeslocamento aritmético para a direitaror(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)Rd é rodado Rn bits para a direita.
Uma rotação de (por exemplo) três bits funciona da seguinte forma. Se Rd contiver inicialmente os bits b31 b30..b0, após a rotação conterá b2 b1 b0 b31 b30..b3
4.4. Instruções especiais¶
Os códigos de condição não são afetados por estas instruções.
clz(Rd, Rn)
Rd = count_leading_zeros(Rn)
count_leading_zeros(Rn) retorna o número de bits zero binários antes do primeiro bit um binário em Rn.
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) retorna o conteúdo de Rn com os bits invertidos. Se Rn contiver os bits b31 b30..b0, Rd será definido como b0 b1 b2..b31
Os zeros à direita podem ser contados realizando uma inversão de bits antes de executar clz.