and

and

Assembly RISC-V Referência

lyszt.net aborda and 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

and é uma instrução bit a bit. Um registrador contém 32 bits, que são 32 0s e 1s separados em sequência. Uma instrução bit a bit aplica sua operação a todas as 32 posições de forma independente, e nenhum carry passa entre as posições.

Em um único bit, AND dá 1 apenas quando ambos os bits de entrada são 1, e 0 caso contrário. A forma abaixo aplica essa regra a todas as 32 posições, comparando rs1 e rs2 e escrevendo o resultado em rd.

and rd, rs1, rs2

AND é usado para mascaramento, que mantém alguns bits e limpa outros. Onde a máscara tem um 1, o bit original permanece. Onde a máscara tem um 0, o resultado é 0. Fazer AND de um valor com a máscara 00001111 mantém os quatro bits baixos e limpa o restante. O mascaramento extrai um campo de um valor que empacota vários campos juntos.

O manual do RISC-V lista and, or e xor entre as operações registrador-registrador. Todas elas leem os registradores de origem rs1 e rs2, escrevem o resultado no registrador de destino rd e realizam operações lógicas bit a bit.

No exemplo, 0b1100 (o prefixo 0b marca dígitos binários) recebe AND com 0b1010. Ambas as entradas têm um 1 apenas na posição mais à esquerda, então o resultado é 0b1000, e ele vai para t2.

Exemplo

li t0, 0b1100
li t1, 0b1010
and t2, t0, t1   # t2 = 0b1000