Анимация
JavaScript
|
Главная Библионтека трюки Повсюду в книге при описании машинных команд используются выражения, отличающиеся от обычных арифметических выражений. В "комйьютерной арифмегике" операнды представляют собой битовые строки (или векторы) некоторой фиксированной длины. Выражения компьютерной арифметики похожи на выражения обычной арифметики, но в этом случае переменные обозначают содержимое регистров компьютера. Значение выражения компьютерной арифметики представляет собой строку битов без какой-либо специальной интерпретации; операнды же могут интерпретироваться по-разному. Например, в команде сравнения операнды интерпретируются либо как двоичные целые числа со знаком, либо как беззнаковые целые числа. Поэтому, в зависимости от типа операндов, для обозначения оператора сравнения используются разные символы. Основное отличие между обычными арифметическими дейсгаиями и компьютерными сложением, вычитанием и умножением состоит в том, что результат действий компьютерной арифметики приюдится по модулю 2", где и - размер машинного слова. Еще одно отличие состоит в том, что компьютерная Ефифметика содержит большее количество операций. Кроме основных четырех арифметических действий, машина способна выполнить множество других команд: логические и {and), исключающее или, сравнение, сдвиг влево и др. Если не оговорено иное, везде в книге предполагается, что длина слова равна 32 битам, а целые числа со знаком представляются в дополнительном к 2 коде. Если длина слова иная, такие случаи оговариваются особо. Все выражения компьютерной арифметики записываются аналогично обычным арифметическим выражениям, с тем отличием, что переменные, обозначающие содержимое регистров компьютера, выделяются полужирным шрифтом (это обычное соглашение, принятое в векторной алгебре). Машинное слово интерпретируется как вектор, состоящий из отдельных битов. Константы также выделяются полужирным шрифтом, если обозначают содержимое регистра (в векторной алгебре аналогичного обозначения нет, так как там для записи констант используется только один способ - указание компонентов вектора). Если константа означает часть команды (например, непосредственно значение в команде сдвига), то она не вьщеляется. Если оператор, например "+", складывает выделенйые полужирным шрифтом операнды, то он подразумевает машинную операцию сложения ("векторное сложение"). Если операнды не выделены, то подразумевается обычное арифметическое сложение скалярных величин (скалярное сложение). Переменная х обозначает арифметическое значение выделенной полужирным шрифтом переменной х (интерпретируемое как знаковое или беззнаковое, что должно быть понятно из контекста). Таким образом, если X = 0x80000000, 3 = 0x80000000, то при знаковой интерпретации л:=у=-2, х+у=-2 и х+у = 0. (Здесь 0x80000000- шестнадцатеричная запись строки битов, состоящей из одного единичного бита и следующих за ним 31 нулевого бита.) Биты нумеруются справа налево, причем крайний справа (младший) бит имеет номер 0. Длины бита, полубайта, байта, полуслова, слова и двойного слова равны соответственно 1,4, 8,16, 32 и 64 бит. Небольшие и простые фрагменты кода представлены в виде алгебраических выражений с оператором присваивания (стрелка влево) и при необходимости с оператором if. Для таких задач использование математических выражений предпочтительнее, чем составление программы на языке ассемблера. Более сложные и громоздкие алгоритмы представлены в виде программ на языке С++, причем свойства С++- как объектно-ориентированного языка программирования нигде в книге не используются. По сути, программы написаны на С, но с комментариями в стиле С++. Там, где различия между С и С++ не существенны, подразумевается просто язык С. Полное описание языка С выходит за рамки данной книги. Однако для тех читателей, которые не знакомы с С, в табл. 1.1 приведено краткое описание основных элементов этого языка [32]. Это описание особенно полезно для читателей, которые не знакомы с С, но знают какой-либо иной процедурный язык программирования. В таблице перечислены также операторы, которые используются в алгебраических и арифметических выражениях этой книги. Все операторы языка С упорядочены по приоритетам: в начале таблицы расположены операторы, имеющие наиболее высокий приоритет, в конце - операторы с самым низким приоритетом. Буква L в столбце "Приоритет" означает, что данный оператор левоассоциативен, а именно: а • b • с = (а • Ь) • с. Буква R означает, что оператор правоассоциативен. Приведенные в таблице и используемые в книге алгебраические операторы следуют правилам ассоциативности и приоритетам операторов языка С. В дополнение к перечисленному в табл. 1.1 используется ряд обозначений из булевой алгебры и стандартной математики (соответствующие пояснения приводятся по мере необходимости). Таблица 1.1. Элементы языка С и алгебраические операторы
[ 0 ] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |