![](/user_photo/2706_HbeT2.jpg)
- •Вычислительные машины, системы и сети
- •Оглавление
- •Введение
- •Раздел 1. Центральный процессор
- •1.1. Архитектура центрального процессора
- •1.2. Организация памяти и способы адресации
- •1.3. Общая характеристика системы команд
- •1.4. Команды пересылки данных
- •1.5. Арифметические команды
- •1.6. Сдвиги и логические команды
- •1.7. Команды обработки строк данных
- •1.8. Команды передачи управления
- •1.9. Команды управления процессором
- •Раздел 2. Арифметический процессор
- •2.1. Архитектура арифметического процессора
- •2.2. Программная модель арифметического процессора
- •2.3. Система команд арифметического процессора
- •Раздел 3. Эволюция характеристик цп
- •3.1. Архитектура цп Pentium
- •3.2. Программная модель цп Pentium
- •3.3. Система команд ммх-расширения
- •3.4. Система команд sse-расширения
- •Раздел 4. Системные устройства вм
- •4.1. Программируемый контроллер прерываний
- •4.2. Программируемый контроллер пдп
- •4.3. Системный таймер
- •4.4. Системные регистры
- •Раздел 5. Защищенный режим работы вм
- •5.1. Максимальный режим работы цп
- •5.2. Дескрипторы и шлюзы
- •Контрольные вопросы
- •Раздел 6. Язык ассемблера
- •6.1. Программирование на языке ассемблера
- •6.2. Директивы языка ассемблера asm-86
- •6.3. Использование регистров Pentium
- •6.4. Директивы языка ассемблера asm-89
- •6.5. Модели программ, компиляция и отладка
- •Контрольные вопросы
- •Раздел 7. Специфика вычислительных систем
- •7.1. Мультипроцессорные системы
- •7.2. Управление процессами
- •7.3. Семафорные операции
- •7.4. Разделение общих процедур
- •7.5. Управление памятью
- •Контрольные вопросы
- •Раздел 8. Специализированные процессоры и вм
- •8.1. Процессор ввода-вывода
- •8.2. Программная модель процессора ввода-вывода
- •8.3. Система команд процессора ввода-вывода
- •8.4. Процессор операционной системы
- •Контрольные вопросы
- •Раздел 9. Назначение и топология сетей
- •9.1. Особенности и назначение сетей различных типов
- •Топология «звезда».
- •9.2. Кодирование информации
- •9.3. Назначение и структура пакетов
- •9.4. Методы управления обменом
- •9.5. Эталонные модели
- •Контрольные вопросы
- •Раздел 10. Практическая реализация сетей
- •10.1. Адресация в сетях
- •10.2. Основные службы Internet
- •10.3. Особенности web-дизайна
- •10.4. Особенности и тенденции развития Internet
- •Контрольные вопросы
- •Глоссарий
- •Литература
1.6. Сдвиги и логические команды
Группа сдвигов и логических команд служит для реализации ряда функций, связанных с преобразованием и анализом операндов, которые размещаются как в регистре, так и в памяти.
Команды сдвига. Обеспечивают прежде всего удвоение чисел и деление пополам. Для удвоения числа без знака достаточно сдвинуть все его разряды на один влево, заполнив младший бит нулем. Поскольку старший бит при сдвиге передается в разряд CF, анализ значения этого флага позволяет судить о точности результата. Например, удвоение числа 65 (01000001) путем сдвига влево дает точный результат 130 (10000010), что определяется значением CF=0. Дальнейшее удвоение даст неправильный результат 4 (00000100), что определяется значением CF=1. Аналогично, используя сдвиг вправо, осуществляется деление числа без знака пополам. Например, сдвигая число 13 (00001101), получаем 6 (00000110) и CF=1, что свидетельствует о неточном результате.
Команды, выполняющие удвоение и деление пополам чисел без знака, имеют мнемокоды SHL (логический сдвиг влево) и SHR (логический сдвиг вправо) соответственно. Аналогичные операции для чисел со знаком реализуются с помощью команд SAL (арифметический сдвиг влево) и SAR (арифметический сдвиг вправо).
Длина сдвигаемого операнда, как обычно, определяется полем w первого байта (w = 0 - 8-разрядный операнд, w = 1 - 16-разрядный операнд). С помощью любой из перечисленных команд сдвига операнд может сдвигаться на произвольное число разрядов до 8 или 16 включительно.
Значение флага OF устанавливается равным «1», если окончательное значение бита знака при последнем сдвиге отличается от его предыдущего значения.
Логические команды. Служат для реализации четырех булевых функций: AND (поразрядное логическое И), OR (поразрядное логическое ИЛИ), XOR (поразрядная логическая сумма по модулю 2) и NOT (поразрядное логическое НЕ). Сюда также относится команда TEST (проверка), которая состоит в поразрядном логическом умножении (И) операндов без занесения результата умножения в место назначения и служит для анализа содержимого источника по значениям флагов.
Все двухоперандные команды AND, OR, XOR и TEST имеют по три одинаковых формата и совпадают по времени исполнения. Однооперандная команда NOT осуществляет инвертирование операнда и имеет один формат. Следует отметить, что при выполнении логических команд флаги CF и OF не изменяют своих значений, а в соответствии с результатом операции устанавливаются флаги PF, SF и ZF. Флаг AF после выполнения логических команд имеет неопределенное значение.
1.7. Команды обработки строк данных
Строкой называют последовательность байтов или слов, размещаемую в смежных ячейках памяти. Примером может служить строка, которая вводится с терминала в ВМ. Операции со строками выполняются над каждым элементом строки (байтом или словом), так что время их выполнения пропорционально числу элементов в строке. В ЦП имеется несколько однобайтных команд, выполняющих простые операции над строками. Эти команды значительно ускоряют манипуляции над строками благодаря уменьшению времени, затрачиваемого на обработку каждого элемента и на вспомогательные действия, которые необходимо выполнять между обработкой последовательных элементов. К вспомогательным действиям относятся: переадресация элемента строки, уменьшение на единицу счетчика числа обрабатываемых элементов и проверка достижения счетчиком нуля.
Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса первого элемента исходной строки и строки результата используются регистры SI (индекс источника) и DI (индекс места назначения) соответственно, число пересылаемых элементов задается в регистре-счетчике СХ. Пересылка строки заключается в выполнении следующих шагов (при описании каждого шага указана соответствующая команда):
1: JCXZ Exit ; если СХ=0, то пересылка закончена
2: MOV AL, [SI] ; переслать байт из в AL
3: MOV [DI], AL ; запомнить содержимое AL в памяти
4: INC SI ; увеличить SI на «1»
5: INC DI ; увеличить DI на «1»
6: DEC СХ ; уменьшить СХ на «1»
7: JNZ 1 ; перейти к шагу 1.
Собственно пересылка байта выполняется на шагах 2 и 3. На шагах 4 и 5 осуществляется вычисление адресов источника и места назначения для следующего элемента строки. Наконец, шаги 1, 6 и 7 служат для определения числа обработанных элементов.
Действия, которые выполняются с помощью указанных четырех команд на протяжении шагов 2-5, могут быть выполнены с помощью одной команды MOVS (переслать элемент строки). Для организации циклического исполнения команды MOVS (а также других команд обработки строк) используется однобайтовая команда-префикс REP (повторить). Она записывается перед основной командой (например, REP MOVS) и обеспечивает ее выполнение N раз. Число повторений N предварительно записывается в регистр СХ и на каждом шаге содержимое СХ уменьшается на единицу. Используются три мнемокода команды-префикса: REP, REPNE/REPNZ и REPE/REPZ. Первый мнемокод анализирует только одно условие окончания повторений: (СХ)=0. В тех случаях, когда возникает необходимость дополнительно анализировать условие ZF=0 (или ZF=1), используется второй (или третий) мнемокод. Команда REP позволяет еще больше сократить время на обработку элементов строки за счет совмещения операций (СХ) = (СХ) - 1 с проверкой достижения счетчиком нуля. Так, совокупность действий, выполняемых за семь указанных выше шагов, может быть выполнена командой MOVS с префиксом REP.
В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего ее элемента. Например, требуется переслать строку, содержащую 10 байт и расположенную в памяти, с относительного адреса (SI) = 200 по (SI) = 209 в область памяти с относительного адреса (DI)=205 no (DI) =214. Ясно, что такую пересылку нельзя выполнять начиная с первого элемента, так как области памяти с исходной строкой и строкой-результатом перекрываются и первая же пересылка «испортит» значение пятого элемента исходной строки. Требуемую пересылку строк можно осуществить начиная с последнего элемента исходной строки. В этом случае следует установить начальные адреса элементов строк равными (SI) =205 и (DI) =214. Кроме того, при пересылке каждого элемента необходимо не увеличивать, а уменьшать на единицу содержимое индексных регистров SI и DI. Направление передачи устанавливается с помощью флага DF: при значении DF=1 происходит автодекрементирование индексных регистров, а при значении DF=0 - автоинкрементирование.
Когда в качестве элементов строк используются не байты, а слова, соответствующее увеличение или уменьшение значений индексных регистров осуществляется на два, т. е. при DF=1: SI = SI - 2; DI = DI - 2, а при DF=0: SI = SI + 2, DI = DI + 2.
Кроме команды MOVS для действия со строками имеется еще четыре команды: CMPS (сравнение элементов строк), SCAS (сканирование элементов строки), LODS (загрузка элемента строки) и STOS (заполнение элемента строки).
Команда CMPS позволяет осуществить поэлементное сравнение двух строк, одна из которых располагается в памяти с относительного адреса, указанного в SI, а вторая - с относительного адреса, указанного в DI. По команде CMPS производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI. Как обычно, при выполнении операции сравнения результат вычитания не фиксируется, а устанавливаются соответствующие значения флагов, по которым определяется результат сравнения. По аналогии с командой MOVS при сравнении изменяются значения индексных регистров по правилу: SI = SI ± А; DI = DI ± A, где « + » - используется при DF=0; «-» - при DF=1; А=1- при w = 0; А = 2 при w=1.
Для циклического повторения команды CMPS используется префикс повторения REPNE/REPNZ или REPE/REPZ.
По команде сканирования SCAS производится сравнение значения элемента строки, расположенной с относительного адреса, который указан в DI, со значением AL. При этом также осуществляется операция вычитания, результат которой не фиксируется. Одно из возможных применений команды сканирования состоит в отыскании элемента строки, равного заданному образцу.
Образцовый элемент загружается в AL и затем организуется цикл сканирования с использованием префикса повторения REPE/REPZ. Как и при выполнении предыдущих команд, каждый раз по команде SCAS производится автоинкремент (или автодекремент) адреса элемента: (DI) = (DI) ± A.
Две следующие команды LODS (загрузка элемента строки) и STOS (запись элемента строки) позволяют загружать элементы строки в аккумулятор и записывать содержимое аккумулятора в строку. При выполнении этих команд осуществляется подготовка адреса следующего элемента строки, т. е. модифицируется содержимое соответствующего индексного регистра. Однако повторение команды LODS обычно не используется, а повторение команды STOS, организуемое с помощью префикса REP, применяется при загрузке строки константой, предварительно помещенной в аккумулятор.
Рассмотренные выше команды работы со строками реализуют относительно простые операции, на базе которых можно организовать более сложные операции обработки строк.