andi

andi

Assembly RISC-V Referência

lyszt.net aborda andi e outras instruções RISC-V com mais detalhes.

Formato de codificação

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descrição

andi realiza AND bit a bit com uma constante. and recebe dois registradores, mas andi recebe um registrador e um imediato, um valor fixo codificado na instrução. O i significa imediato. A regra do AND é inalterada: um bit do resultado é 1 apenas quando ambos os bits de entrada são 1, então a constante atua como uma máscara que preserva alguns bits e limpa os outros. Mascaramento e operações bit a bit são abordados na página and.

A forma de andi é mostrada abaixo. Ela faz AND do valor em rs1 com a constante imm e escreve o resultado em rd.

andi rd, rs1, imm

Use-a quando você sabe de antemão quais bits manter. A linha seguinte mantém os 8 bits mais baixos de t0 e limpa os 24 superiores, extraindo um byte de um valor maior. O prefixo 0x marca uma constante hexadecimal.

andi t1, t0, 0xff

A constante deve caber em 12 bits, então não pode expressar uma máscara ampla. Para uma máscara maior, carregue-a em um registrador com li e use and.

O manual do RISC-V diz que o imediato de 12 bits é estendido com sinal para 32 bits antes da operação, então uma constante negativa tem todos os seus bits superiores definidos. andi, ori e xori realizam a operação bit a bit no registrador rs1 e nesse valor estendido e colocam o resultado em rd.

Dois usos comuns seguem. A primeira linha abaixo mantém apenas o bit mais baixo, que é 1 para números ímpares e 0 para números pares. A segunda linha dá o resto após dividir por 8, porque um resto sem sinal por uma potência de dois são os bits mais baixos.

andi t1, t0, 1
andi t1, t0, 7

Exemplo

andi t1, t0, 0xff   # keep only the low byte