Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример. Циклическая адресация




Пример. Работа с целыми числами

Пример. Управление памятью

typedef struct tagABC typedef struct tagABC

{ {

int a; long b;

long b; int a;

int c; int c;

} ABC; } ABC;

 

extern int Xflag; extern int Xflag;

 

int function(void) int function(void)

{ {

x = Xflag? Xflag & 0xFFFE: Lflag; int Lflag = Xflag;

return x; x = Lflag? Lflag & 0xFFFE: lflag;

} /* длинный код */ return x;

} /* короткий код */

Пояснение.

В данном примере мы сравнили два варианта, которые показывают: как правильно управлять памятью. Основной момент заключается в том, что необходимо выравнивать по двойному слову, иначе за один цикл тип long не сможет быть прочитан. Изначально размещается long, а затем два целых числа. Поэтому в первом случае распределение памяти неправильное. Второй пример: мы имеем переменную на внешнем уровне. Но если ее интенсивно использовать – это приведет к очень длинному коду, потому что будет использован метод адресации через регистры. А если сначала определить внутреннюю переменную и присвоить ей внешнее значение, то дальше доступ к внутренней переменной будет происходить через SP(stack pointer). Что занимает гораздо меньше времени и места. Вывод - лучше работать с локальными, а не с глобальными переменными.

long mult(int sw, int a, int b, long* res)

{

long result;

switch(sw)

{

case 0: /* не корректно */

result = a * b; *res = a + b;

break;

case 1: /* не корректно */

result = (long)(a * b); *res = (long)(a + b);

break;

case 2: /* корректно */

result = (long)a * b; *res = (long)a + b;

break;

default: /* корректно */

result = (long)a * (long)b; *res = (long)a + (long)b;

}

return result;

}

Пояснение.

Рассмотрим первую часть программы (case 0, case 1), которая некорректно производит вычисления. Предположим, что необходимо получить результат типа long (32-битный). В данном примере, вследствие перемножения и сложения двух целый чисел, результат преобразуется к 16-битному, возможно с сатурацией (насыщением). А потом только расширяется до длинного. Поэтому такая реализация будет ошибочна, в связи с тем, что происходит потеря диапазона чисел.

Теперь рассмотрим вторую часть программы(case 2, default). В данном случае, мы изначально один из аргументов преобразуем в long, поэтому дальнейшие операции выполняются с длинными операндами. И результат вычисляется без потерь. Это объясняется тем, что компилятор преобразует второй аргумент к типу первого.

Циклическая адресация представляет метод адресации, при котором происходит циклическое обращение к ячейкам некоторой области памяти (к ячейкам буфера), т.е. адресация осуществляется на основе циклического буфера b[x]. Этот буфер представляет собой набор ячеек в памяти данных, где за последней ячейкой буфера как бы находится первая ячейка буфера, а перед первой ячейкой — как бы находится последняя ячейка. Таким образом, не зависимо от значения смещения, исполнительный адрес всегда будет находиться внутри этой области.

long circ(const int *a, const int *b, int n, int m)

{

int i, x=0;

long sum=0;

for(i=0; i<n; i++)

{

sum += (long)a[i] * b[x % m];

x++;

}

return sum;

}

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




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 685; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.