Введення та виведення

Введення та виведення

обробляє все введення та виведення. (виклик середовища) просить операційну систему або симулятор виконати службу для вашого коду асемблера. Екран і клавіатура — це дві зі служб, доступних у такий спосіб.

Спочатку покладіть номер послуги в a7, будь-який аргумент у a0, а потім викличте . Послуги, які знає цей симулятор:

Послуги (a7)
1 # вивести ціле число (a0 = число)
4 # вивести рядок (a0 = адреса тексту)
5 # зчитати ціле число (результат повертається в a0)
10 # вийти з програми
32 # пауза (a0 = мілісекунди)
Виклик служби
програма
a71
a0значення
ecall
системавиводить число

a7 = 1 вибирає службу друку.

Кожна послуга використовує однакове рукостискання через два регістри. a7 вказує, яку послугу запускати, а a0 несе все, що потрібно цій послузі: значення для друку, адресу для читання, тривалість очікування. Список фіксований і короткий, п'ять записів, тож вивчивши це рукостискання один раз, ви охопите всі способи, якими цей симулятор спілкується із зовнішнім світом. Справжня операційна система розширює ту саму ідею до значно довшого списку.
Зчитати число, подвоїти його, вивести
li a7, 5 # зчитати ціле число -> a0
ecall
add a0, a0, a0 # подвоїти його
li a7, 1 # вивести ціле число
ecall
li a7, 10
ecall

вибирає читання цілого числа, а призупиняє виконання в очікуванні введення, повертаючи ваше число в a0. додає a0 до самого себе, подвоюючи його на місці. Потім і виводять результат, а і завершують програму. Коли ви запустите її, симулятор покаже поле введення. Введіть число й подивіться, як воно повернеться подвоєним.

Друк тексту

Спочатку два нові слова. Секція — це позначена міткою ділянка вашої програми: інструкції живуть у секції .text, а фіксовані дані, як-от текст, — у секції .data. А адреса — це просто число, яке ідентифікує один слот у пам'яті. Замість того щоб носити з собою цілий рядок, регістр може нести адресу, з якої цей рядок починається, і служба друку читає звідти.

Текст розміщується в секції даних. Ви прив'язуєте до нього мітку, а потім використовуєте ("load address"), щоб завантажити адресу цієї мітки, і службу 4, щоб його вивести.

Привіт, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = адреса тексту
li a7, 4 # вивести рядок
ecall
li a7, 10
ecall

У .data директива резервує місце для тексту й прив'язує мітку msg. .string зберігає символи та додає \n — символ нового рядка. У .text поміщає адресу тексту в a0, вибирає службу виведення рядка, а виводить символи з цієї адреси, доки не досягне кінця рядка. Потім програма завершується як зазвичай.