nop
의사lyszt.net은 nop 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
설명
nop는 아무것도 하지 않습니다. 이름은 "no operation"을 줄인 것입니다. 프로세서가 nop에 도달하면 레지스터는 변하지 않고, 메모리에도 손대지 않으며, 실행은 다음 명령어로 계속됩니다. 프로그램에서 한 슬롯을 차지하고 한 틱의 시간이 지납니다.
nop는 아래 줄에 대한 의사 명령어입니다.
addi zero, zero, 0
RISC-V에는 항상 0을 담고 있는 zero라는 레지스터가 있습니다. 읽기는 0을 반환하고, 쓰기는 버려집니다. 이 addi는 0과 0을 더하고 결과를 버리므로 명령어는 완료되고 아무것도 변하지 않습니다. RISC-V는 zero 레지스터가 nop를 제공하므로 전용 nop가 필요하지 않습니다.
실제 프로세서는 nop를 패딩으로 사용하여 이후 명령어가 하드웨어가 더 빠르게 처리하는 메모리 경계에서 시작하도록 하고, 나중에 도구가 실제 명령어로 덮어쓸 자리 표시자로도 사용합니다. 컴파일러는 당연하게도 이를 삽입하므로, 프로그래머가 입력하지 않았는데도 디스어셈블된 코드에 포함됩니다.
RISC-V 매뉴얼에는 nop가 pc를 진행시키고 성능 카운터를 증가시키는 것 외에는 프로그램이 관찰할 수 있는 것을 포함해 아키텍처적으로 보이는 상태를 변경하지 않는다고 명시되어 있습니다. 두 가지 용도를 제시합니다. 코드 세그먼트를 하드웨어에 맞는 주소 경계에 정렬하는 것과 나중에 코드를 변경할 여지를 남기는 것입니다. 매뉴얼은 이 인코딩이 addi를 사용하는 이유를 설명하는데, 이 명령어가 레지스터를 하나만 읽기 때문에 대부분의 시스템에서 가장 적은 자원을 소비하기 때문입니다.
이 시뮬레이터에서 nop는 실험 중에 간격을 두거나 표시하는 역할을 합니다. 하나를 스텝 오버하면 pc는 4만큼 앞으로 이동하고 레지스터나 메모리 위치는 변하지 않습니다.
확장 대상
addi zero, zero, 0
어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.
예시
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
