1) вычитание 16 из указателя стека резервирует место в стеке для текущего кадра. Чтобы сохранить вещи в этом зарезервированном пространстве, вы добавляете смещение (в данном случае 12) к указателю уменьшенного стека.
2) sw
хранит слово (в данном случае значение 0, которое x0всегда содержит) из регистра в память, и вы правы (IMO), что порядок аргументов выглядит обратным по сравнению с остальной частью синтаксиса.
3) a) мы использовали указатель стека длясохранить и восстановить адрес возврата, который в этой небольшой функции, которая сама по себе не выполняет вызов, не нужен, но в качестве стандартного шаблона для входа и выхода из функции это полезный шаблон. Стек используется для хранения локальных переменных, которые не помещаются в регистры (или должны быть в стеке для поддержки рекурсии), и изучение того, как с ним работать, является частью того, что они показывают вам здесь.
3 b) sw
сохраняет значение из регистра в памяти, а lw
загружает из памяти и сохраняет в регистре. В драйвере устройства места памяти - это то, как вы взаимодействуете с устройством. Хранение в памяти позволяет передавать на устройство информацию (данные или управляющую информацию), а загрузка из памяти - это способ чтения информации с устройства.