Слайд 2
Краткое содержание предыдущей серии
Что такое ассемблер?
Что такое процессорные
регистры и зачем они нужны?
Как организована память?
Где хранится код?
А
как он при этом выглядит?
Слайд 3
Краткое содержание сегодняшней серии
Системы счисления
Что такое «архитектура» компьютера
Регистры
в ARM Cortex M3
Набор команд Thumb 2
Способы адресации в
ARM Cortex M3
Слайд 4
Системы счисления
Что такое система счисления?
Метод записи чисел.
В зависимости
от основания системы одна и та же запись означает
разное число:
1005 =
1002 =
2510
410
Слайд 5
Двоичная система
Широко применяется в информатике, программировании и т.д.
Но почему?
Потому что компьютеры очень удобно делать из двоичных
электронных компонентов.
Слайд 6
Двоичная система
Почему люди не пользуются двоичной системой?
По историческим
причинам
Относительно небольшие числа в ней записываются очень длинно:
10 0111
0000 11112 = 999910
Слайд 7
А программисту зачем двоичная система?
В низкоуровневом программировании бывает
так, что число не несет количественного смысла.
Вместо этого, каждый
бит в двоичном представлении числа имеет свой смысл.
Слайд 8
Что делать, если часто нужно считать в двоичной
системе?
Нужно научиться быстро переводить числа из одной системы в
другую.
Как?
Быстро делить в уме
Использовать специальный софт (напр., калькулятор windows)
Использовать шестнадцатеричную или восьмеричную систему
Слайд 9
Шестнадцатеричная система (hexadecimal)
В ней 16 цифр, 0..9, А,B,C,D,E
и F.
В языке С такие числа записываются с префиксом
0x:
0xFF
Но что все это дает?
Слайд 10
Шестнадцатеричная система (hexadecimal)
16 – это 24, поэтому каждая
цифра в hex’е – это 4 цифры в двоичной
системе!
И переводить числа очень легко:
0x1532
0001
0101
0011
0010
542610 перевести в двоичную систему в уме сложнее
Слайд 11
Если вам не легко
То нужно научится считать в
двоичной системе от 0 до F:
Слайд 12
В языке С
В языке С можно использовать три
системы счисления:
Десятичную – просто числа, без префиксов
Шестнадцатеричную – числа
с префиксом 0x
Восьмеричную – с префиксом 0
В некоторых компиляторах есть нестандартный префикс 0b для двоичной системы
Слайд 13
Подвох
Программист для красоты выровнял колонку цифр.
И десятичное
37 превратилось в восьмеричное 037 == 31.
Слайд 14
ARM
Advanced RISC Machines – британская компания
ARMv1.. ARMv9 –
архитектуры ЭВМ
ARM2...ARM11 и Cortex – микропроцессорные ядра
ARM не производит
физических устройств, только спецификации
Мы изучаем микроконтроллер STM32F103
ST Microelectronics – производитель чипа
32 – «битность»
F103 - серия
Cortex M3 – ядро (М – означает микроконтроллер) с архитектурой ARMv7
Слайд 15
Что же такое «архитектура компьютера»?
Это сочетание многих системных
решений об устройстве компьютера, концептуальная структура, которая включает в
себя
Набор ассемблерных команд (instruction set)
«Битность»
Тип памяти (Гарвард или фон Нейман)
Количество и назначение шин
Общие принципы работы
И т. д.
Слайд 16
Что такое «битность»?
32-битный компьютер обладает:
32-битными регистрами
32-битной шиной адреса
32-битной
шиной данных
Возможно, не все сразу – т.е. понятие это
несколько расплывчато.
Слайд 17
Типы архитектур
CISC – Complex Instruction Set Computer
RISC –
Restricted Instruction Set Computer
Слайд 19
Архитектура ARMv7
RISC-подобная
Набор команд Thumb-2 (совместим с Thumb из
ARMv4)
32 бита
фон Неймановская память (единое адресное пространство)
13 регистров общего
назначения
Endianness (и еще многое) на выбор производителя
Слайд 20
Набор команд Thumb 2
Большая часть команд длиной 2
байта, есть команды в 4 байта (мнемоники единообразные)
Большая часть
команд выполняется за 2 такта (дольше – умножение, деление, множественная загрузка/сохранение и т.д.)
Только целочисленная арифметика
Подробности - ARMv7-M Architecture Reference Manual
Слайд 23
Как выглядит ассемблер в Keil
Команда movs r0, #0x05
– поместить (от слова move) в регистр R0 число
5
Слайд 24
Подробнее о команде
Итак, 0x080003A4 2005 MOVS
r0,#0x05
означает «по адресу 0x8003A4 хранится: положить в регистр
R0 число 5»
А откуда берется число пять?
Оно лежит прямо в коде команды! 2005
Это называется «непосредственная» адресация (immediate)
Слайд 25
Подробнее о команде
Итак, 0x080003A4 2005 MOVS
r0,#0x05
означает «по адресу 0x8003A4 хранится: положить в регистр
R0 число 5»
А где написано, что R0?
Тоже в команде! 2005
Это «регистровая адресация» – один из операндов – регистр и его номер указан прямо в команде.
Слайд 26
Структура команды (на примере 16-битной mov)
0x2005 =
0010 0000 0000 0101
Пять старших бит показывают что это,
собственно, команда mov
Биты 10, 9 и 8 задают номер регистра
Биты с 7 по 0 задают непосредственный операнд
Поразительным образом все, что делает команда, указано прямо в команде!
Слайд 27
А какая вообще бывает адресация?
Косвенность, теоретически, может наращиваться
бесконечно - по адресу лежит адрес, по которому лежит
адрес, по которому...
(указатель на указатель на указатель...)
Слайд 28
Абсолютная адресация в Cortex M3
Команды имеют длину 2
или 4 байта.
Адреса имеют длину 4 байта.
Как
же положить адрес прямо в команду?
А никак. В Cortex M3 такого способа адресации нет!
Что же делать?
Слайд 29
Косвенно-регистровая адресация
Синтаксис – квадратные скобки
LDR R0, [R1,#0x00]
– считать в регистр R0 значение, лежащее по адресу
«то, что в R1 + 0»
Смещение лежит прямо в команде и может быть от 0 до 4095.
Для адресации глобальных переменных часто используется регистр РС. Но почему?
Слайд 30
Немножко о компиляции языка С
Каждый файл .c компилируется
отдельно от остальных и превращается в файл .o –
«объектный файл»
Линкер разрешает зависимости между файлами, проставляет вызовы функций
Линкер размещает объектные файлы в памяти
Вывод?
Линкеру удобно положить адрес переменной рядом с кодом, который к ней обращается. Если они в одном файле.