Команды переменной длины

В машинном языке, описанном в приложении В, все команды имеют фиксированную длину (два байта). Следовательно, для того чтобы выбрать команду, центральный процессор извлекает содержание двух соседних ячеек памяти и добавляет к значению счетчика команд два. На самом же деле, в большинстве машинных языков используются команды различной длины. Например, в процессорах Pentium применяются как команды, длина которых равна одному байту, так и команды, длина которых зависит от конкретного использования команды. Центральные процессоры с такими машинными языками определяют длину поступающей команды по коду операции. То есть сначала центральный процессор извлекает код операции данной команды, а затем, основываясь на полученной последовательности битов, определяет, сколько еще байтов нужно извлечь из памяти, чтобы получить оставшуюся часть команды.

Программы и данные

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

Однако необходимо помнить, что поскольку данные, хранящиеся в памяти, также закодированы с помощью 0 и 1, машина сама не может определить, где данные, а где программа. Если счетчику команд приписать адрес данных, а не адрес программы, компьютер просто извлечет эти данные, как если бы они были командой, и выполнит эту команду. Результат зависит от этих данных.

Не следует делать вывод, что одинаковое представление данных и программ в памяти компьютера неудобно. На самом деле, такое свойство позволяет одной программе манипулировать другими программами (или самой собой) как данными. Например, представьте программу, которая меняется сама в ответ на какое-либо действие или контекст, проявляя таким образом способности к обучению. Или программа, которая пишет и выполняет другие программы, чтобы решить задачи, поставленные перед ней.

Арифметические и логические операции

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

Логические операции

В главе 1 мы определили логические операции AND (И), OR (ИЛИ) и XOR (исключающее ИЛИ) как операции, которые на входе имеют два бита, а на выходе порождают один. Это определение можно расширить: операции, которые на входе имеют две цепочки битов, а на выходе порождают одну цепочку, применяя базовую операцию к отдельным столбцам1. Например, результат операции AND над последовательностями 10011010 и 11001001 будет таким:

где мы просто записали результат операции AND над парой битов каждого столбца под соответствующим столбцом. По этому же принципу выполнение операции OR и XOR над этими последовательностями в результате даст:

Операция AND используется главным образом для того, чтобы поместить нули в определенную часть последовательности битов, не затрагивая при этом другую часть. Рассмотрим, например, что произойдет, если взять байт 00001111 в качестве первого операнда операции AND. He зная содержимого второго операнда, мы все же можем утверждать, что первые четыре разряда результата будут нулями. Кроме того, четыре последних разряда результата будут совпадать с последними разрядами второго операнда, как показано в следующем примере:

Такое использование операции AND называется процессом маскирования (masking). Операнд, называемый маской (mask), определяет, какая часть другого операнда подвергается изменению. В случае операции AND результат маскирования является копией одного из операндов с изменениями в определенных позициях.

Такая операция может быть полезна при манипулировании побитовыми отображениями (bit map), цепочками битов, в которых каждый бит обозначает наличие или отсутствие определенного признака. Например, в растровых изображениях, где каждый бит соответствует одному пикселу. Вот другой пример. Цепочку из 52 битов, в которой каждый бит соответствует определенной игральной карте, можно использовать для обозначения карт, находящихся на руках у игрока в покер, приписав значение 1 тем пяти битам, которые соответствуют картам игрока, и значение 0 всем остальным битам. Точно так же последовательность из 52 битов, которая содержит 13 единиц и нули, можно использовать для обозначения карт игрока в бридж. Или последовательность из 32 битов может обозначать, какие сорта мороженого сейчас доступны.

Теперь предположим, что ячейка памяти состоит из восьми битов и используется в качестве побитового отображения. Нам нужно выяснить, имеется ли в наличии объект, соответствующий третьему биту от старшего конца. Для этого нужно просто выполнить операцию AND над этим байтом и маской 00100000, в результате которой мы получим байт, состоящий из нулей только в том случае, когда третий бит двоичного отображения равен 0. Затем программа может действовать в соответствии с условной командой перехода. Кроме того, если третий бит равен 1 и мы хотим, чтобы он был равен 0, а значения других битов оставались без изменений, можно выполнить операцию AND над побитовым отображением и маской 11011111, а затем сохранить полученный результат вместо исходного отображения.

Если операция AND применяется для копирования части цепочки с помещением нулей в оставшуюся часть, то операция OR — для копирования части цепочки с помещением в оставшуюся часть единиц. Для этого мы опять используем маску, но теперь мы отмечаем позиции битов, которые нужно копировать, нулями.

Например, выполнение операции OR над любым байтом и последовательностью 11110000 в результате даст цепочку, в которой значения первых четырех старших битов равны 1, а остальные биты копируют четыре младших бита другого операнда:

Следовательно, если маску 11011111 можно использовать с операцией AND для того, чтобы значение третьего бита слева было равно 0, то маску ОО10О0ОО можно использовать с операцией OR для получения противоположного результата.

Операция XOR используется главным образом для получения дополнения цепочки битов. Обратите, например, внимание на отношение между вторым операндом и результатом в следующем примере:

Выполнение операции XOR над любым байтом и байтом, состоящим из единиц, в результате даст дополнение первого байта, рассматриваемого как набор отдельных битов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: