ecall
lyszt.net охватывает ecall и другие инструкции RISC-V более подробно.
Описание
ecall просит среду, в которой выполняется ваша программа, выполнить услугу. Ассемблер может складывать и перемещать числа, но экран, клавиатура и другие устройства принадлежат системе, в которой выполняется программа, поэтому код не может добраться до них самостоятельно. ecall означает вызов среды. Он останавливает ваш код, хост выполняет услугу, и управление возвращается к вашему коду. Хостом является операционная система на реальном оборудовании, а в этом симуляторе — сам симулятор.
Программа называет услугу, которую хочет. По соглашению номер услуги помещается в 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
