Различия между версиями 2 и 3
Версия 2 от 2020-01-22 16:38:50
Размер: 6497
Редактор: Lecture_Uploads
Комментарий:
Версия 3 от 2020-06-24 20:02:38
Размер: 6464
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 1: Строка 1:
04. Code addressing: conditionals, loops and arrays

= 04.1 Conspect (ru) =

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

На самом деле никаких типов данных в ассемблере нету - нету разницы какого типа данные у нас лежат ячейках - главное только их размер.

В коде программы могут быть тоже метки:

2.png

В случае сложения у нас переполнение может быть ровно один бит.

Есть два дополнительных регистра который называются high и lo и результат умножения инструкции mult помещает нужное слово в lо, а результат умножения в high все что туда не поместилойсь.

Инструкция li оказалось все инструкции раскрылась как обычно в загрузку старший половины и добавляем туда младшею половину с помощью побитого оr.

Деление целочисленное - мы заморачиваемся частным и остатком.

Операция умножения и операции деления с точки зрения аппаратной реализации весьма и весьма сложные.

Что такое умножение на 2 в какой-то степени? Просто сдвиг в нужную сторону соответственно.

Основным принципом системы команд mips является экономия времени то есть желательно чтобы каждый каждая инструкция выполнялась за один такт работы машины.

Поскольку размер инструкции у нас всегда четыре байта никакие команды перехода не могут производиться на адреса некратный 4.

Пример программы:

3.png

Операция слова jump она в качестве параметра имеет непосредственный адрес но тоже поделенный на 40 и сдвинуты вправо на 2 именно потому что он всегда будет кратным четырем.

Инструкции типа b без ничего значит безусловный переход (branch).

Есть четыре стадии инициализации цикла:

проверка условия

собственно тело полезная нагрузка и

изменение того что участвует в условие.

Ассемблер прибавляет еще два подпункта.

Цикл с постусловием довольно неприятная штука - он выполнит 1 оборот циклу вне зависимости от того что было в условиях даже если оно было неверно. Хотя цикл с постусловием будет на один jump меньше содержать.

  • Любой массив на любом языке программирования когда он заявлен - это кусок памяти непрерывной состоящие из однотипных элементов

одинакового размера которые лежат подряд. Обращение к этому элементу массива очень дешевая операция (константная)- мы берем его начало и прибавляем к нему размер данных.

  • Обратите внимание что li и la в действительности это одна и та же инструкция разница стоит только в семантике.

Положить машинное слово из регистра t0 в регистр t1 редкий редкий случай когда инструкция устроена таким образом что new destination в конце - обычно у нас destination в начале.

HSE/ArchitectureASM/04_ConditionalsArrays/Conspect (последним исправлял пользователь FrBrGeorge 2020-06-24 20:02:38)