ecall

ecall

RISC-V 어셈블리 참조

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

설명

ecall은 프로그램이 실행되는 환경에 서비스를 수행하도록 요청합니다. 어셈블리는 숫자를 더하고 이동할 수 있지만, 화면, 키보드 및 기타 장치는 프로그램을 호스팅하는 시스템에 속하므로 코드만으로는 접근할 수 없습니다. ecall은 environment call(환경 호출)의 약자입니다. 코드를 중지하고, 호스트가 서비스를 수행한 후 제어권이 코드로 돌아옵니다. 호스트는 실제 하드웨어에서는 운영 체제이며, 이 시뮬레이터에서는 시뮬레이터 자체입니다.

프로그램은 원하는 서비스를 지정합니다. 관례상 서비스 번호는 a7에, 서비스에 필요한 데이터는 a0에 넣은 다음 ecall을 실행합니다. 이 시뮬레이터는 다음과 같은 서비스를 제공합니다: 1은 a0의 정수를 출력하고, 4는 a0의 주소에 있는 텍스트를 출력하고, 5는 입력에서 숫자를 읽어 a0에 넣고, 10은 프로그램을 종료하고, 32는 a0밀리초 동안 일시 정지합니다.

숫자를 출력하려면 1을 a7에 로드하여 출력 서비스를 선택하고, 숫자를 a0에 로드한 다음 ecall을 실행합니다. 예제에서 이를 수행합니다. 서비스 10은 프로그램을 종료시키므로, 레슨은 아래 두 줄로 끝납니다. 이것이 없으면 프로세서는 마지막 줄을 지나 다음에 오는 것으로 계속 진행합니다.

li a7, 10
ecall

RISC-V 매뉴얼에는 ecall이 실행 환경에 서비스 요청을 하고, 환경이 매개변수 전달 방식을 결정하며, 일반적으로 정의된 정수 레지스터를 사용한다고 명시되어 있습니다. 이 시뮬레이터가 여기서의 환경이며 위에 나열된 서비스 번호를 정의합니다. 매뉴얼은 또한 ecall이 한때 scall로 불렸다고 언급합니다. 그 짝인 ebreak은 제어권을 디버거로 반환합니다. 둘 다 환경에 정확한 요청 트랩을 발생시킵니다.

완전한 운영 체제도 같은 방식으로 작동하지만, 서비스 목록이 더 깁니다.

예시

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42