Разделы презентаций


Есть ли у вас вопросы?

Содержание

Краткое содержание предыдущей серииКак в ассемблере cortex m3 организована работа с памятью?Зачем нужны длинные команды?Какое бывает поведение в С?Что такое отступы?

Слайды и текст этой презентации

Слайд 1Есть ли у вас вопросы?

Есть ли у вас вопросы?

Слайд 2Краткое содержание предыдущей серии
Как в ассемблере cortex m3 организована работа

с памятью?

Зачем нужны длинные команды?

Какое бывает поведение в С?

Что такое

отступы?
Краткое содержание предыдущей серииКак в ассемблере cortex m3 организована работа с памятью?Зачем нужны длинные команды?Какое бывает поведение

Слайд 3Краткое содержание этой серии
Числа со знаком

Операции в языке С

Ассемблерные команды,

им соответствующие

Краткое содержание этой серииЧисла со знакомОперации в языке САссемблерные команды, им соответствующие

Слайд 4Комментарии в Кейле
Ne pishite kommentarii translitom

Чтобы включить русский язык:
edit ->

configuration -> encoding (UTF8)
edit -> configuration -> colors&fonts -> c/c++

editor -> font (courier new)

Or just comment your code in english, that would be nice.
Комментарии в КейлеNe pishite kommentarii translitomЧтобы включить русский язык:edit -> configuration -> encoding (UTF8)edit -> configuration ->

Слайд 5Двоичные числа
Допустим, у нас есть сетка из 4 разрядов. Сколько

различных чисел мы можем хранить с ее помощью?
24 т.е. 16
Для

чисел без знака диапазон выглядит вот так:

Наименьшее число – 0
Наибольшее число – 15

Двоичные числаДопустим, у нас есть сетка из 4 разрядов. Сколько различных чисел мы можем хранить с ее

Слайд 6Двоичные числа
Допустим, у нас есть сетка из 4 разрядов.
Но

мы хотим хранить числа со знаком.
Сколько различных чисел мы сможем

хранить?
по-прежнему 24 т.е. 16

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

Слайд 7Как хранить знак?
Как хранить знак, если у вас есть только

биты?
Например, назначить один бит знаковым!
А в остальных хранить модуль числа.

Этот

способ называется «прямой код» - «sign and magnitude».

= -2

= 2

Как хранить знак?Как хранить знак, если у вас есть только биты?Например, назначить один бит знаковым!А в остальных

Слайд 8Прямой код
Плюсы:
«Интуитивно понятен для человека»
Удобен при программировании на ассемблере
Используется в

стандарте IEEE 754 – т.е. для представления чисел с плавающей

точкой

Минусы:
Два способа записи для числа 0 (+0 и -0)
Сложная схемотехника для арифметических операций с числами разного знака
Позиция знакового бита зависит от количества разрядов (т.е. от типа переменной).
Но можно сделать знаковым нулевой бит!
Прямой кодПлюсы:«Интуитивно понятен для человека»Удобен при программировании на ассемблереИспользуется в стандарте IEEE 754 – т.е. для представления

Слайд 9А как еще можно хранить знак?
Что должно быть?
-1 + 1

должно быть равно 0
-2 + 1 должно быть равно -1

(и далее, по индукции)

Вспоминаем о свойствах арифметики на ограниченной разрядной сетке.
А как еще можно хранить знак?Что должно быть?-1 + 1 должно быть равно 0-2 + 1 должно

Слайд 10Сложение в ограниченной разрядной сетке
Допустим, что у нас есть 4

двоичных разряда. В них можно представить только 16 разных чисел.

А

что будет, если мы возьмем число 15 и прибавим к нему 1?
Должно получится 16, но для этого нужен пятый разряд. А его нет. Поэтому бит просто «потеряется».

Это называется переполнение (сверху) – integer overflow.

+

Сложение в ограниченной разрядной сеткеДопустим, что у нас есть 4 двоичных разряда. В них можно представить только

Слайд 11Сложение в ограниченной разрядной сетке.
Получилось, что в сетке из четырех

разрядов 15 + 1 = 0.

Почему бы не отобрать

двоичное представление числа 15 и не сказать, что так мы теперь кодируем -1?
А как представить -2? Так, чтобы -2+1 было равно -1.

По индукции, получаем следующее
Сложение в ограниченной разрядной сетке.Получилось, что в сетке из четырех разрядов  15 + 1 = 0.Почему

Слайд 1211112 + 1 = 0 это -1 + 1
11102 + 1

= 1111 2 это -2 + 1
11012 + 1 = 1110 2 это -3

+ 1
...
но нужно ведь когда-то остановится!

Удобно, если количество отрицательных и неотрицательных чисел одинаковое.
Тогда наименьшее отрицательное число будет
10002 – равное -8

Оставшиеся числа отдадим под неотрицательные.
11112 + 1 = 0		это -1 + 111102 + 1 = 1111	2	это -2 + 111012 + 1

Слайд 13Дополнительный код

Дополнительный код

Слайд 14Дополнительный код
На английском – «two’s complement» – «дополнение до двух».


Плюсы:
Удобная арифметика – вычитание через сложение!
Единственная запись числа 0
Простая смена

знака схемотехникой (инвертировать все биты и прибавить 1)
Единица в старшем бите означает, что число отрицательное

Минусы:
Не очень-то удобно для человека
Отрицательных чисел на 1 больше чем положительных
Запись одинаковых чисел зависит от разрядной сетки!


Дополнительный кодНа английском – «two’s complement» – «дополнение до двух». Плюсы:Удобная арифметика – вычитание через сложение!Единственная запись

Слайд 15Отрицательные числа
Но это не единственные способы!
Обратный код
Нега-двоичная система (по основанию

-2)
...

Сюрприз:
Стандарт языка С не описывает, как именно хранятся числа со

знаком!
Отрицательные числаНо это не единственные способы!Обратный кодНега-двоичная система (по основанию -2)...Сюрприз:Стандарт языка С не описывает, как именно

Слайд 16Арифметические операции в С
+, -, *, / и %
их комбинации

с = (+=, -+ и т.д.)
++ и -- (пост- и

пред-)
сравнения
индекс (a[3]), который на самом деле сложение и разыменование

% - взятие остатка от деления
Арифметические операции в С+, -, *, / и %их комбинации с = (+=, -+ и т.д.)++ и

Слайд 17Арифметика в ассемблере
Целочисленная (в Cortex M3 «родная»)
С плавающей точкой (в

Cortex M3 организована программно)

Векторная (в Cortex M3 отсутствует)
SIMD (single instruction

multiple data) (в Cortex M3 отсутствует)



Дальше речь только о целочисленной арифметике, для которой есть специализированные инструкции
Арифметика в ассемблереЦелочисленная (в Cortex M3 «родная»)С плавающей точкой (в Cortex M3 организована программно)Векторная (в Cortex M3

Слайд 18Арифметика в ассемблере Сложение
ADD r0, r1, r2 – сложение с

переполнением (overflow) (короткая и длинная версии)

ADDW – длинная версия,

поддерживает 12-битовый непосредственный операнд (wide)

ADDS – сложение с обновлением регистра состояния (Status); вообще S – это постфикс

ADC – сложение с учетом флага Carry (переноса)

ADCS - ?

ADDWS и ADDWC - ... отсутствуют.
Арифметика в ассемблере СложениеADD  r0, r1, r2 – сложение с переполнением (overflow) (короткая и длинная версии)

Слайд 19Арифметика в ассемблере Что еще за флаг Carry?
Пусть мы складываем два

десятичных числа из 3 цифр. Сколько цифр нам понадобиться (в

худшем случае), чтобы записать результат?
4.
Почему?
Потому что в худшем случае: 999 + 999 = 1998

Это работает и в двоичном коде, ведь 1+1 = 10.
Арифметика в ассемблере Что еще за флаг Carry?Пусть мы складываем два десятичных числа из 3 цифр. Сколько

Слайд 20Арифметика в ассемблере Что еще за флаг Carry?
Флаг Carry (он же

бит переноса) и есть этот дополнительный двоичный разряд при сложении.

Флаг

Carry находится в регистре состояний.

Префикс S у команды означает, что «команда влияет на регистр статуса» – в том числе, может установить флаг Carry

Т.е. ADDS r0, r1,r2 – складывает содержимое двух регистров и может установить флаг переноса. Происходит точное сложение, без выхода за разрядную сетку!
Арифметика в ассемблере Что еще за флаг Carry?Флаг Carry (он же бит переноса) и есть этот дополнительный

Слайд 21Арифметика в ассемблере Что еще за флаг Carry?
ADC – сложение с

учетом бита переноса (он просто прибавляется к слагаемым).

И зачем это

нужно?

Чтобы складывать 64-битные (или еще более длинные) числа!

Сначала складываются младшие 32 бита (с выставлением бита переноса), потом складываются старшие 32 бита с учетом переноса!
Арифметика в ассемблере Что еще за флаг Carry?ADC – сложение с учетом бита переноса (он просто прибавляется

Слайд 22Арифметика в ассемблере Какие еще есть флаги?
С – флаг Carry (перенос)

N

– флаг Negative (отрицательный результат)

Z – флаг Zero (результат 0)

V

– флаг oVerflow (знаковое переполнение,
«неверная» смена знака)


Есть и другие, но к арифметике они не относятся
Арифметика в ассемблере Какие еще есть флаги?С – флаг Carry (перенос)N – флаг Negative (отрицательный результат)Z –

Слайд 23Примеры
Для простоты, пусть у нас есть регистры из 4 бит
Сложение

без переноса (ADD):





+
Результат из пяти бит, регистр из 4 –

последний бит просто теряется.
Это называется «переполнение» - overflow.
Постфикса S в команде нет – регистр флагов не обновляется

В данном случае получается, что 15+1 = 0

В некоторых случаях, это совершенно нормально (сложение по модулю 16)
ПримерыДля простоты, пусть у нас есть регистры из 4 битСложение без переноса (ADD):+Результат из пяти бит, регистр

Слайд 24Примеры
Для простоты, пусть у нас есть регистры из 4 бит
Сложение

с обновлением регистра состояний (ADDS):





+
Результат из пяти бит, регистр из

4. Так как команда с постфиксом S – обновляется флаг Carry (и в нем, фактически, хранится пятый бит).

Так как в результат в регистре получился нулевой – выставляется и флаг Zero

Потери данных нет, четыре бита результата в регистре, пятый – флаг С
ПримерыДля простоты, пусть у нас есть регистры из 4 битСложение с обновлением регистра состояний (ADDS):+Результат из пяти

Слайд 25Примеры
Пусть у нас есть регистры из 4 бит, но мы

хотим складывать 8-битные числа.
Пусть мы хотим сложить 0011 1111 +

0001 0001 (63+17).
Складывать придется по частям. Сначала младшие биты, потом старшие





+

Складываем младшие биты через ADDS, получаем младшие биты результата:

Теперь складываем старшие биты с учетом флага carry (ADC) – с переносом:

+

+

Результат: 0101 0000 (80) в двух регистрах

ПримерыПусть у нас есть регистры из 4 бит, но мы хотим складывать 8-битные числа.Пусть мы хотим сложить

Слайд 26Арифметика в ассемблере Вычитание
SUB r0, r1, r2 – вычитание, короткая

и длинная версии (r0 = r1-r2) c переполнением снизу (underflow)

SUBW

– длинная версия с 12-битовым непосредственным операндом

SUBS – вычитание с обновлением регистра состояния

SBC – вычитанием с учетом Carry (если carry = 0 – вычесть еще 1)

RSB r0,r1,r2 –> r0 = r2-r1 (вычитание наоборот).

SBCS, RSBS – понятно

RSBC, RSBW, SUBWS.. - отсутствуют
Арифметика в ассемблере ВычитаниеSUB  r0, r1, r2 – вычитание, короткая и длинная версии (r0 = r1-r2)

Слайд 27Арифметика в ассемблере Сложение и вычитание
А где в сложении и вычитании

учитывался знак?
А нигде. Но почему?

Потому что целые отрицательные числа в

архитектуре ARMv7 хранятся в дополнительном коде!
А числа в дополнительном коде можно складывать и вычитать, не обращая внимания на знак.

Арифметика в ассемблере Сложение и вычитаниеА где в сложении и вычитании учитывался знак?А нигде. Но почему?Потому что

Слайд 28Арифметика в ассемблере Умножение
Допустим, мы умножаем 2 трехзначных числа. Сколько потребуется

цифр, чтобы хранить результат?
6, к сожалению
Почему?
Потому что 999*999 = 998 001

Вывод:

int32+int32 поместится в int32 (и бит carry)
int32*int32 поместится только в int64
Арифметика в ассемблере УмножениеДопустим, мы умножаем 2 трехзначных числа. Сколько потребуется цифр, чтобы хранить результат?6, к сожалениюПочему?Потому

Слайд 29Арифметика в ассемблере Умножение

Арифметика в ассемблере Умножение

Слайд 30Арифметика в ассемблере Деление
Делить в дополнительном коде, не обращая внимания на

знак, к сожалению, нельзя.
На ноль тоже делить нельзя...?

Но при делении

можно не беспокоится, что результат не влезет в разрядную сетку.. правда?

К сожалению, нельзя:

int16_t a = -32768;
int16_t b = -1;

a = a/b; // ???
Арифметика в ассемблере ДелениеДелить в дополнительном коде, не обращая внимания на знак, к сожалению, нельзя.На ноль тоже

Слайд 31Арифметика в ассемблере Деление
UDIV r0, r1, r2

r0 = r1/r2 (беззнаковое деление)
SDIV r0,r1,r2

r0 = r1/r2 (знаковое деление)

На ноль делить нельзя.
Деление целочисленное, поэтому 1/2 = 0.

А как же сделать операцию % ?
a % b эквивалентно temp = a/b; result = a - temp*b; (так вот зачем нужен MLS!)
Арифметика в ассемблере ДелениеUDIV  r0, r1, r2    r0 = r1/r2 (беззнаковое деление)SDIV

Слайд 32Деление в С
Помните:

целочисленное деление на ноль – undefined behavior

%

(остаток от деления) для отрицательных чисел может быть неожиданным для

вас
30 % 4 =
-30 % -4 =
-30 % 4 =
30 % -4 =

Стандарт определяет его как implementation-defined.

2

-2

-2

2

Деление в СПомните: целочисленное деление на ноль – undefined behavior% (остаток от деления) для отрицательных чисел может

Слайд 33Сравнения в ассемблере
CMP r0, r1 temp

= r0 – r1, обновить регистр состояний, отбросить temp (аналогично

SUBS temp, r0,r1)

CMN r0,r1 temp = r0 + r1, обновить регистр состояний, отбросить temp (аналогично ADDS temp, r0,r1)

TEQ r0,r1 (test equality), аналог ==, компилятором используется редко

Сравнения в ассемблереCMP  r0, r1    temp = r0 – r1, обновить регистр состояний,

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика