Слайд 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.
Слайд 14ARM
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 – «объектный файл»
Линкер разрешает
зависимости между файлами, проставляет вызовы функций
Линкер размещает объектные файлы в памяти
Вывод?
Линкеру удобно положить адрес переменной рядом с кодом, который к ней обращается. Если они в одном файле.
Слайд 31А где в ассемблере учитывается тип?
У команд есть вариации:
W –
word – слово – 4 байта
H – halfword – полуслово
– 2 байта
B – byte – байт – 1 байт
S – signed – знаковый