ori

ori

RISC-V 어셈블리 참조

lyszt.net은 ori 및 기타 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

설명

ori는 상수와 비트 단위 OR 연산을 수행합니다. ori와 or의 관계는 andi와 and의 관계와 같습니다. i는 즉시값(immediate)을 뜻하며, 명령어 안에 인코딩된 고정값입니다. ori는 두 레지스터를 OR하는 대신 레지스터와 그 상수를 OR합니다. OR 규칙은 바뀌지 않습니다. 결과의 각 비트 위치는 그 자리의 두 비트 중 하나라도 1이면 1이 되므로, 상수가 원하는 비트를 설정합니다. 이 연산은 or 페이지에서 설명합니다.

ori의 형식은 아래와 같습니다. rs1의 값을 상수 imm과 OR한 뒤 결과를 rd에 씁니다.

ori rd, rs1, imm

OR은 비트를 설정하고 나머지는 그대로 두므로, ori는 켜야 할 플래그를 알고 있을 때 그 플래그를 켭니다. 다음 줄은 t0의 오른쪽에서 세 번째 비트를 켜고 다른 비트는 모두 그대로 둡니다. 0b 접두사는 이진 상수를 나타냅니다.

ori t0, t0, 0b100

구성 레지스터, 권한 플래그, 상태 워드는 서로 독립적인 켜짐/꺼짐 비트를 담고 있으며, ori는 마스크 레지스터 없이 명령어 하나로 선택한 비트를 켭니다.

RISC-V 매뉴얼은 12비트 즉시값이 연산 전에 32비트로 부호 확장된다고 명시합니다. 따라서 음수 상수는 상위 비트가 모두 설정되어 있으며, -1과 ori를 하면 결과의 모든 비트가 설정됩니다.

상수는 andi, addi와 마찬가지로 12비트로 제한됩니다. 이 범위를 벗어나는 비트를 설정하려면 li로 더 넓은 마스크를 레지스터에 로드한 뒤 or를 사용합니다.

예시

li t0, 0
ori t1, t0, 0xf   # t1 = 0xf