li
의사lyszt.net은 li 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
설명
li는 상수를 레지스터에 로드합니다. 이 이름은 load immediate의 약자이며, immediate는 코드에 직접 작성된 고정값을 의미합니다. 다음 줄은 42를 t0에 저장합니다.
li t0, 42
대부분의 프로그램은 카운터, 한계값, 서비스 코드를 포함한 알려진 숫자를 레지스터에 넣는 것으로 시작합니다.
load라는 단어는 하드웨어 제약에서 비롯됩니다. RISC-V 명령어는 32비트 길이이며 연산, 레지스터, 상수를 함께 담아야 합니다. 하나의 명령어는 완전한 32비트 상수를 담을 수 없습니다. 작은 상수는 들어가고 큰 상수는 들어가지 않습니다.
li는 그 제약을 우회합니다. 이것은 의사 명령어로, 어셈블러가 값에 필요한 실제 명령어로 대체하는 이름입니다. 작은 값은 명령어 하나면 됩니다. 큰 값은 두 개가 필요하며, 하나는 상위 부분을 설정하고 다른 하나는 하위 부분을 더하므로, 다음 줄은 어떤 크기의 숫자에도 작동합니다.
li t1, 0x10010000
시뮬레이터는 li가 확장되는 실제 명령어를 표시합니다.
RISC-V 매뉴얼은 lui를 32비트 상수를 구성하는 명령어로 설명합니다. 이는 20비트 값을 대상 레지스터의 상위 비트에 배치하고 최하위 12비트를 0으로 채웁니다.
li와 la는 서로 다른 것을 로드합니다. li는 입력한 숫자를 로드하고 la는 레이블이 나타내는 주소를 로드합니다. 이 예제는 작은 값과 큰 값을 로드하며, 어셈블러는 둘 다 같은 방식으로 처리합니다.
확장 대상
addi rd, zero, imm # small constants lui rd, hi + addi rd, rd, lo # large constants
어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.
예시
li t0, 42 li t1, 0x10010000
