andi

andi

RISC-V 어셈블리 참조

lyszt.net은 andi 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

인코딩 형식

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

설명

andi는 상수와 비트 AND 연산을 수행합니다. and는 두 개의 레지스터를 받지만, andi는 레지스터와 즉시값(명령어에 인코딩된 고정 값)을 받습니다. i는 즉시값(immediate)을 의미합니다. AND 규칙은 변하지 않습니다. 결과 비트는 두 입력 비트가 모두 1일 때만 1이 되므로, 상수는 일부 비트를 보존하고 나머지를 지우는 마스크 역할을 합니다. 마스킹과 비트 연산은 and 페이지에서 다룹니다.

andi의 형식은 아래와 같습니다. rs1의 값과 상수 imm을 AND 연산하고 그 결과를 rd에 씁니다.

andi rd, rs1, imm

어떤 비트를 유지할지 미리 알고 있을 때 사용하세요. 다음 줄은 t0의 최하위 8비트를 유지하고 상위 24비트를 지워, 더 큰 값에서 1바이트를 추출합니다. 0x 접두사는 16진수 상수를 나타냅니다.

andi t1, t0, 0xff

상수는 12비트에 맞아야 하므로 넓은 마스크를 표현할 수 없습니다. 더 큰 마스크의 경우 li로 레지스터에 로드하고 and를 사용하세요.

RISC-V 매뉴얼에 따르면 12비트 즉시값은 연산 전에 32비트로 부호 확장되므로, 음수 상수는 상위 비트가 모두 설정됩니다. andi, ori, xori는 레지스터 rs1과 그 확장된 값에 비트 연산을 수행하고 결과를 rd에 넣습니다.

두 가지 일반적인 용도는 다음과 같습니다. 아래 첫 번째 줄은 최하위 비트만 유지하는데, 이는 홀수면 1이고 짝수면 0입니다. 두 번째 줄은 8로 나눈 나머지를 구하는데, 2의 거듭제곱으로 나눈 부호 없는 나머지는 최하위 비트이기 때문입니다.

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

예시

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