Введення та виведення
обробляє все введення та виведення. (виклик середовища) просить операційну систему або симулятор виконати службу для вашого коду асемблера. Екран і клавіатура — це дві зі служб, доступних у такий спосіб.
Спочатку покладіть номер послуги в a7, будь-який аргумент у a0, а потім викличте . Послуги, які знає цей симулятор:
1 # вивести ціле число (a0 = число)4 # вивести рядок (a0 = адреса тексту)5 # зчитати ціле число (результат повертається в a0)10 # вийти з програми32 # пауза (a0 = мілісекунди)
a7 = 1 вибирає службу друку.
a7 вказує, яку послугу запускати, а a0 несе все, що потрібно цій послузі: значення для друку, адресу для читання, тривалість очікування. Список фіксований і короткий, п'ять записів, тож вивчивши це рукостискання один раз, ви охопите всі способи, якими цей симулятор спілкується із зовнішнім світом. Справжня операційна система розширює ту саму ідею до значно довшого списку.li a7, 5 # зчитати ціле число -> a0ecalladd a0, a0, a0 # подвоїти йогоli a7, 1 # вивести ціле числоecallli a7, 10ecall
вибирає читання цілого числа, а призупиняє виконання в очікуванні введення, повертаючи ваше число в a0. додає a0 до самого себе, подвоюючи його на місці. Потім і виводять результат, а і завершують програму. Коли ви запустите її, симулятор покаже поле введення. Введіть число й подивіться, як воно повернеться подвоєним.
Друк тексту
Спочатку два нові слова. Секція — це позначена міткою ділянка вашої програми: інструкції живуть у секції .text, а фіксовані дані, як-от текст, — у секції .data. А адреса — це просто число, яке ідентифікує один слот у пам'яті. Замість того щоб носити з собою цілий рядок, регістр може нести адресу, з якої цей рядок починається, і служба друку читає звідти.
Текст розміщується в секції даних. Ви прив'язуєте до нього мітку, а потім використовуєте ("load address"), щоб завантажити адресу цієї мітки, і службу 4, щоб його вивести.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = адреса текстуli a7, 4 # вивести рядокecallli a7, 10ecall
У .data директива резервує місце для тексту й прив'язує мітку msg. .string зберігає символи та додає \n — символ нового рядка. У .text поміщає адресу тексту в a0, вибирає службу виведення рядка, а виводить символи з цієї адреси, доки не досягне кінця рядка. Потім програма завершується як зазвичай.
