
- •Память с адресной организацией (с произвольным доступом).
- •Непосредственная адресация
- •Когда может произойти стековый доступ к памяти
- •Как происходит стековый доступ к памяти
- •Регистровый файл
- •Счетчик команд
- •Идея базовой адресации – достижение позиционной независимости. (к 50-51)
- •Непосредственная адресация
- •3. Проверки и передача управления.
- •3.4. Команда организации цикла
- •Переполнение при действиях над целыми числами.
- •Целые со знаком: дополнительный код
- •Сложение и вычитание
- •Поддержка действий с повышенной разрядностью
- •Как перейти от представления с однарной точностью к представлению с двойной ?
- •Особые случаи при действиях над числами пт
- •Неточный результат - округление и его виды
- •Численное антипереполнение, денормализованные и ненормализованные числа, псевдонуль.
- •Действия с бесконечностями
- •Регистр состояния программы (Program status register)
- •Счетчик команд
- •Способы синхронизации: программный опрос состояния versus прерывания
- •Таймерная подсистема
- •Основной счетчик
- •Техника измерения времени (чтение счетчика)
- •Ассоциативная память
Сложение и вычитание
Обе операции трехоперандные: два слагаемых и результат. Формат команды может быть: 3-х операндным – 2-х операндным – результат помещается на место одного из слагаемыых (так в I*86) 1-операндным – второй операнд и сумма находятся в предопределенном месте (в регистре-аккумуляторе) нуль-операндным – оба операнда находятся в предопределенных местах (чаще всего это два верхних элемента стека, который может быть организован как аппаратно, так и программно).
Будем, если не оговорено другое, использовать соглашения ассемблера Intel
add a, b aa + b так принято в Intel – ассемблере, т.е. результат сложения помещается на место операнда, указываемого первым. Аналогично для вычитания : sub a, b
Приятная особенность дополнительного кода для представления отрицательных чисел:
Результат действий сложения и вычитания при использовании дополнительного кода имеет один и тот же вид, независимо от того, интерпретируются ли операнды как беззнаковые или как знаковые.
Для действий умножения и деления это не так.
Глядя на двоичное представление целого числа, невозможно сказать, знаковое оно или беззнаковое.
При выполнении операции сложения или вычитания схемотехника процессора изменяет значения битов cfи of. Анализируя эти биты, можно узнать, не выходит ли результат сложения или вычитания за пределы представимого диапазона. (Как это сделать, узнаем позже).
Поддержка целочисленной арифметики повышенной разрядности.
Поддержка действий с повышенной разрядностью
В большинстве известных процессоров в случае переполнения разрядной сетки устанавливается специальный флаг переполнения - C-бит.
+
an-1 an-2……a1 a0 первый операнд _bn-1 bn-2……b1 b0_ второй операнд C sn-1 sn-2……s1 s0 сумма (если возникает перенос – он устанавливает C-бит)
an-1 an-2……a1 a0 первый операнд _bn-1 bn-2……b1 b0_ второй операнд C sn-1 sn-2……s1 s0 разность (если возникает заем – он устанавливает C-бит)
Если не хватает разрядности, поддерживаемой АЛУ, то можно искусственно увеличить разрядность - хранить величины в нескольких машинных словах. Рассмотрим, как можно организовать сложение двух «длинных» операндов, используя «короткое» сложение.
|
+ |
an-1 an-2 …… a1 a0 |
|
+cf |
bn-1 bn-2 …… b1 b0 |
+ |
A2n-1 a2n-2 …… an-1 an |
|
+ |
B2n-1 b2n-2 …… bn-1bn |
|
cf |
B2n-1 b2n-2 …… bn-1bn |
bn-1 bn-2 …… b1 b0 |
Результат переноса при сложении младших частей регистрируется в флагеперееноса(C, cf) (независимо от того, знаковые операнды или беззнаковые). Значение флага переноса надо учитывать при сложении старших частей.
Для учета при сложении значения флага переноса cf в систему команд добавляют команду сложения с переносом: adc a, b (работает так: a a + b + cf)
Последовательность команд при выполнении сложения с двойной точностью может быть такой
add b0, a0 ; b0 b0 + a0 (переносвcf) adc b1, a1 ; b1 b1 + a1 + cf (легко аналогично реализовать утроенную, учетверенную .... точность).
В некоторых архитектурах с двухоперандными командами сложения/вычитания команда adcоднооперандная :a=a+cf и тогда так:
add b0, a0 ; b0 b0 + a0 adc b1 ; b1 b1 + cf add b1, a1 ; b1 b1 + a1 // Вопрос о тройной точности
Аналогично, для вычитания. В составе системы команд обычно имеется команда вычитания, учитывающая заем. Заем при выполнении вычитания также (как и перенос) фиксируется в значении флага c.