04.1 Conspect (ru)
Машинное слово его адрес должен быть кратным четырем. Когда мы размещаем в памяти половину машина снова его адрес должен быть кратным 2. А когда мы размещаем в памяти байт он может быть каким угодно.
Помним что директивы vault world half и байт это директивы а не инструкции.
Машинное слово будучи прочтено по байтно записывается в результате задом наперёд именно потому что младший байт у него справа.
Надо сказать что если вы хотите вручную выровнить память то вы можете
использовать директиву align.
Прямая адресация это когда мы указываем прямо регистр в номер регистров и содержимое этого регистра считаем данными непосредственно адресации.
Еще есть команды типа g - они состоят из обхода одного большого числа.
Адресация косвенная когда у нас в регистре лежал адрес ячейки.
В основном мы будем использовать команды типа &.
Некоторые символы можно использовать не по номеру а
прямо в апострофах. Пример:
.data a: .word 12345 chr: .byte '\n' .text li $v0 1 lw $a0 a syscall li $v0 11 lb $a0 chr syscall
На самом деле никаких типов данных в ассемблере нету - нету разницы какого типа данные у нас лежат ячейках - главное только их размер.
В коде программы могут быть тоже метки:
В случае сложения у нас переполнение может быть ровно один бит.
Есть два дополнительных регистра который называются high и lo и результат умножения инструкции mult помещает нужное слово в lо, а результат умножения в high все что туда не поместилойсь.
Инструкция li оказалось все инструкции раскрылась как обычно в загрузку старший половины и добавляем туда младшею половину с помощью побитого оr.
Деление целочисленное - мы заморачиваемся частным и остатком.
Операция умножения и операции деления с точки зрения аппаратной реализации весьма и весьма сложные.
Что такое умножение на 2 в какой-то степени? Просто сдвиг в нужную сторону соответственно.
Основным принципом системы команд mips является экономия времени то есть желательно чтобы каждый каждая инструкция выполнялась за один такт работы машины.
Поскольку размер инструкции у нас всегда четыре байта никакие команды перехода не могут производиться на адреса некратный 4.
Пример программы:
Операция слова jump она в качестве параметра имеет непосредственный адрес но тоже поделенный на 40 и сдвинуты вправо на 2 именно потому что он всегда будет кратным четырем.
Инструкции типа b без ничего значит безусловный переход (branch).
Есть четыре стадии инициализации цикла:
проверка условия
собственно тело полезная нагрузка и
изменение того что участвует в условие.
Ассемблер прибавляет еще два подпункта.
Цикл с постусловием довольно неприятная штука - он выполнит 1 оборот циклу вне зависимости от того что было в условиях даже если оно было неверно. Хотя цикл с постусловием будет на один jump меньше содержать.
- Любой массив на любом языке программирования когда он заявлен - это кусок памяти непрерывной состоящие из однотипных элементов
одинакового размера которые лежат подряд. Обращение к этому элементу массива очень дешевая операция (константная)- мы берем его начало и прибавляем к нему размер данных.
- Обратите внимание что li и la в действительности это одна и та же инструкция разница стоит только в семантике.
Положить машинное слово из регистра t0 в регистр t1 редкий редкий случай когда инструкция устроена таким образом что new destination в конце - обычно у нас destination в начале.