Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура компьютера - Таненбаум Э

..pdf
Скачиваний:
492
Добавлен:
24.05.2014
Размер:
5.67 Mб
Скачать

Типы команд

383

команд вводится команда NEG. Важно понимать разницу между арифметической операцией NEG и логической операцией NOT. Операция NEG производит аддитивную инверсию числа (такое число, сумма которого с изначальным числом дает 0). Операция NOT просто инвертирует все биты в слове. Эти операции очень похожи, а для системы, в которой используется представление в обратном двоичном коде, они идентичны. (В арифметике дополнительных кодов для выполнения команды NEG сначала инвертируются все биты, а затем к полученному результату прибавляется 1.)

Унарные и бинарные операции часто объединяются в группы по функциям, которые они выполняют, а вовсе не по числу операндов. В первую группу входят арифметические операции, в том числе операция отрицания. Во вторую группу входят логические операции и операции сдвига, поскольку эти две категории очень часто используются вместе для извлечения данных.

Сравнения и условные переходы

Практически все программы должны проверять свои данные и на основе результатов изменять последовательность команд, которые нужно выполнить. Рассмотрим функцию квадратного корня Ох. Если число х отрицательное, процедура сообщает об ошибке; если число положительное, процедура вычисляет квадратный корень. Функция sqrt должна проверять х, а затем совершать переход в зависимости от того, положительно число х или отрицательно.

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

Самое распространенное условие, которое нужно проверить, — равен ли определенный бит нулю или нет. Если команда проверяет знаковый бит числа и совершает переход к метке (LABEL) при условии, что бит равен 1, то если число было отрицательным, будут выполняться те утверждения, которые начинаются с метки LABEL, а если число было положительным или было равно 0, то будут выполняться те утверждения, которые следуют за условным переходом.

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

В некоторых процессорах есть специальный разряд (бит) переноса, который принимает значение 1, если происходит перенос из самого левого бита (например, при сложении двух отрицательных чисел). Бит переноса нельзя путать с битом переполнения. Проверка бита переноса необходима для вычислений с повышенной точностью (то есть когда целое число представлено двумя или более словами).

384 Глава 5. Уровень архитектуры команд

Проверка на ноль очень важна при выполнении циклов и в некоторых других случаях. Если бы все команды условного перехода проверяли только 1 бит, то тогда для проверки определенного слова на 0 нужно было бы отдельно проверять каждый бит, чтобы убедиться, что ни один бит не равен 1. Чтобы избежать подобной ситуации, во многие машины включается команда, которая должна проверять слово и осуществлять переход, если оно равно 0. Конечно же, это решение просто перекладывает ответственность на микроархитектуру. На практике аппаратное обеспечение обычно содержит регистр, все биты которого соединяются операцией ИЛИ, чтобы выдать на выходе один бит, по которому можно определить, содержит ли регистр биты, равные 1. Бит Z на рис. 4.1 обычно вычисляется следующим образом: сначала все выходные биты АЛУ соединяются операцией ИЛИ, а затем полученный результат инвертируется.

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

Одно из возможных решений — ввести команду, которая выполняет сравнение и записывает результат в один или несколько битов условия. Следующая команда может проверить биты условия и совершить переход, если два сравниваемых значения были равны, или неравны, или первое из них было больше второго и т. д. Такой подход применяется в Pentium II и UltraSPARC II.

В сравнении двух чисел есть некоторые тонкости. Сравнение — это не такая простая операция, как вычитание. Если очень большое положительно число сравнивается с очень большим отрицательным числом, операция вычитания приведет к переполнению, поскольку результат вычитания не может быть представлен. Тем не менее команда сравнения должна определить, удовлетворено ли условие, и возвратить правильный ответ. При сравнении не должно быть переполнений.

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

Без знака

Со знаком

000

100 (самое маленькое)

001

101

010

ПО

011

111

100000

101001

НО 010

111011 (самое большое)

Вколонке слева приведены положительные числа от 0 до 7 по возрастанию.

Вколонке справа показаны целые числа со знаком от -4 до +3 в дополнительном двоичном коде. Ответ на вопрос: «Какое число больше: 011 или 100?» зависит от того, считаются ли числа числами со знаком. В большинстве архитектур есть команды для обращения с обоими типами упорядочения.

Типы команд

385

Команды вызова процедур

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

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

Более удачное решение — сохранить адрес возврата в первом слове процедуры. Тогда первой выполняемой командой будет второе слово процедуры. После завершения процедуры происходит переход к первому слову, а если аппаратное обеспечение в первом слове наряду с адресом возврата дает код операции, то происходит непосредственный переход к этой операции. Процедура может вызывать другие процедуры, поскольку в каждой процедуре имеется пространство для одного адреса возврата. Но если процедуравызывает сама себя, эта схема не работает, поскольку первый адрес возврата будет уничтожен вторым вызовом. Способность процедуры вызывать саму себя, называемая рекурсией, очень важна и для теоретиков, и для практиков. Более того, если процедура А вызывает процедуру В, процедура В вызывает процедуру С, а процедура С вызывает процедуру А (непосредственная или цепочечная рекурсия), эта схема сохранения адреса возврата также не работает.

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

Самое лучшее решение — поместить адрес возврата в стек. Когда процедура завершена, она выталкивает адрес возврата из стека. При такой форме вызова процедур рекурсия не порождает никаких проблем; адрес возврата будет автоматически сохраняться таким образом, чтобы избежать уничтожения предыдущего адреса возврата. Мы рассматривали такой способ сохранения адреса возврата в машине ПУМ(см.рис.4.10).

Управление циклом

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

Определенная процедура запускает счетчик вне цикла и затем сразу начинает выполнение цикла. Последняя команда цикла обновляет счетчик, и если условие завершения цикла еще не выполнено, то происходит возврат к первой команде цикла. Если условие выполнено, цикл завершается и начинается выполнение ко-

386 Глава 5. Уровень архитектуры команд

манды, идущей сразу после цикла. Цикл такого типа с проверкой в начале представлен в листинге 5.3. (Мы не могли здесь использовать язык Java, поскольку в нем нет оператора goto.)

Цикл такого типа всегда будет выполняться хотя бы один раз, даже если п<0. Рассмотрим программу, которая поддерживает данные о персонале компании. В определенном месте программа начинает считывать информацию о конкретном работнике. Она считывает число п — количество детей у работника, и выполняет цикл п раз, по одному разу на каждого ребенка. Она считывает его имя, пол и дату рождения, так что компания может послать ему или ей подарок. Если у работника нет детей, п будет равно 0, но цикл все равно будет выполнен один раз, что даст ошибочные результаты.

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

Листинг 5.3. Цикл с проверкой в конце

Листинг 5.4. Цикл с проверкой в начале

 

i=l:

i=l:

 

L1:

первый оператор:

LI:

if(i>n) goto L2:

 

 

первый

оператор:

 

последний оператор:

 

 

 

1-1+1:

 

последний оператор:

 

if (i<n) goto LI:

 

i=i+l:

 

 

goto LI:

 

 

 

L2:

 

Рассмотрим программу, которую нужно произвести для следующего выражения:

for (i=0; i<n: 1++) {операторы}

Если у компилятора нет никакой информации о числе п, он должен применять подход, приведенный в листинге 5.4, чтобы корректно обработать случай п<0. Однако если компилятор может определить, что п>0 (например, узнав, как определено п), он может использовать более удобный код, изложенный в листинге 5.3. Ко- гда-то в стандарте языка FORTRAN требовалось, чтобы все циклы выполнялись один раз. Это позволяло всегда порождать более эффективный код (листинг 5.3). В 1977 году этот дефект был исправлен, поскольку даже приверженцы языка FORTRAN начали осознавать, что плохо иметь оператор цикла с такой странной семантикой, пустьон и позволяетэкономитьодну команду переходанакаждыйцикл.

Команды ввода-вывода

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

1.Программируемый ввод-вывод с активным ожиданием.

2.Ввод-вывод с управлением по прерываниям.

3.Ввод-вывод с прямым доступом к памяти.

Типы команд

387

Мы рассмотрим каждую из этих схем по очереди.

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

В качестве примера данного метода рассмотрим терминал с четырьмя 1-байт- ными регистрами, как показано на рис. 5.19. Два регистра используются для ввода: регистр состояния устройства и регистр данных. Два регистра используются для вывода: тоже регистр состояния устройства и регистр данных. Каждый из них имеет уникальный адрес. Если используется ввод-вывод с распределением памяти, все 4 регистра являются частью адресного пространства, и будут считываться и записываться с помощью обычных команд. В противном случае для чтения и записи регистров используются специальные команды ввода-вывода, например IN и OUT.

Вобоих случаях ввод-вывод осуществляется путем передачи данных и информации

осостоянии устройства между центральным процессором и этими регистрами.

 

Готовность к получению

Наличный символ

следующего символа

/ Состояние клавиатуры

/ Состояние дисплея

Разрешенное прерывание

\

Разрешенное прерывание

Буфер клавиатуры

Буфер дисплея

Полученныйсимвол

С и м в о л Д™ в ы в о д а

 

на дисплеи

Рис. 5.19. Регистры устройств для простого терминала

Регистр состояния клавиатуры содержит 2 бита, которые используются, и 6 битов, которые не используются. Аппаратное обеспечение устанавливает самый левый бит на 1 всякий раз, когда появляется символ. Если программное обеспечение ранее установило на 1 бит 6, то производится прерывание. В противном случае прерывания не происходит. При программируемом вводе-выводе для получения входных данных центральный процессор обычно находится в цикле, периодически считывая регистр состояния клавиатуры, пока бит 7 не примет значение 1. Когда это случается, программное обеспечение считывает буферный регистр клавиатуры, чтобы получить символ. Считывание регистра данных вызывает установку бита CHARACTER AVAILABLE (наличия символа) на 0.

Вывод осуществляется сходным образом. Чтобы написать символ на экране, программное обеспечение сначала считывает регистр состояния дисплея, чтобы узнать, установлен ли бит READY (бит готовности) на 1. Если он не установлен,

388 Глава 5. Уровень архитектуры команд

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

В качестве примера программируемого ввода-вывода рассмотрим процедуру, написанную на Java (листинг 5.5). Эта процедура вызывается с двумя параметрами: массивом символов, который нужно вывести, и количеством символов, которые присутствуют в массиве (до 1 К). Тело процедуры представляет собой цикл, который выводит по одному символу. Сначала центральный процессор должен подождать, пока устройство будет готово, и только после этого он выводит символ, и эта последовательность действий повторяется для каждого символа. Процедуры in и out — это обычные процедуры языка ассемблера для чтения и записи регистров устройств, которые определяются по первому параметру, из или в переменную, которая определяется по второму параметру. Деление на 128 убирает младшие 7 битов, при этом бит READY остается в бите 0.

Листинг5.5. Пример программируемого ввода-вывода

public static void output_buffer(int buf[]. int count) { //Вывод блока данных на устройство

int status, i. ready;

for (i=0; i<count; i++) {

 

do {

 

status=in(display_status_reg);

// получение информации

 

о состоянии устройства

ready=(status«7)&0x01:

// выделение бита

 

готовности

} while (ready==l);

 

out(display_buffer_reg, buf[i]);

 

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

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

Типыкоманд 389

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

Ввод-вывод с управлением по прерываниям — это большой шаг вперед по сравнению с программируемым вводом-выводом, но все же он далеко не совершенен. Дело в том, что прерывание требуется для каждого передаваемого символа. Следовательно, нужно каким-то образом избавиться от большинства прерываний.

Решение лежит в возвращении к программируемому вводу-выводу. Но только эту работу должен выполнять кто-то другой. Посмотрите на рис. 5.20. Мы добавили новую микросхему — контроллер прямого доступа к памяти (ПДП) с прямым доступом к шине.

Терминал

О

о

Адрес

 

Счетчик \

 

 

Процессор \

\ ПДП

Память

 

100

 

32

100

 

Устройство Направление

Шина Рис. 5.20. Система с контроллером прямого доступа к памяти

Микросхема ПДП имеет по крайней мере 4 регистра. Все они могут загружаться программным обеспечением, работающим на центральном процессоре. Первый регистр содержит адрес памяти, который нужно считать или записать. Второй регистр содержит число, которое показывает количество передаваемых байтов или слов. Третий регистр содержит номер устройства или адрес устройства ввода-вы- вода,определяя, такимобразом,какоеименноустройствонамтребуется. Четвертый регистр сообщает, должны ли данные считываться с устройства или записываться на него.

Чтобы записать блок из 32 байтов из адреса памяти 100 на терминал (например, устройство 4), центральный процессор записывает числа 32,100 и 4 в первые три регистра ПДП и код записи (например, 1) в четвертый регистр, как показано

3 9 0 Глава 5. Уровень архитектуры команд

на рис. 5.20. Контроллер ПДП, инициализированный таким способом, делает запрос на доступ к шине, чтобы считать байт 100 из памяти, точно так же как если бы центральный процессор считывал этот байт. Получив нужный байт, контроллер ПДП посылает устройству 4 запрос на ввод-вывод, чтобы записать на него байт. После завершения этих двух операций контроллер ПДП увеличивает значение регистра адреса на 1 и уменьшает значение регистра счетчика на 1. Если значение счетчика больше 0, то следующий байт считывается из памяти и записывается на устройство ввода-вывода.

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

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

Команды процессора Pentium II

В этом и следующих двух разделах мы рассмотрим наборы команд трех машин: Pentium II, UltraSPARC II и picojava II. Каждая из них содержит базовые команды, которые обычно порождаются компиляторами, а также набор команд, которые редко используются или используются только операционной системой. Мы будем рассматривать обычные команды. Начнем с Pentium II.

Команды Pentium II представляют собой смесь команд 32-битного формата и команд, которые восходят к процессору 8088. На рисунке 5.21 приведены наиболее распространенные команды с целыми числами, которые широко используются в настоящее время. Этот список далеко не полный, поскольку в него не вошли команды с плавающей точкой, команды управления, а также некоторые редкие команды с целыми числами (например, использование 8-битного байта для выполнения поиска по таблице). Тем не менее этот список дает представление о том, какие действия может выполнять Pentium П.

Многие команды Pentium II обращаются к одному или кдвум операндам, которые находятся или в регистрах, или в памяти. Например, бинарная команда ADD

Типы команд

391

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

На рисунке 5.21 поля SRC — это источники информации (SOURCE). Они не изменяются. Поля DST — это пункты назначения (DESTINATION). Они обычно изменяются командой. Существуют правила, определяющие, что может быть источником, а что пунктом назначения, но здесь мы не будем о них говорить. Многие имеют три варианта: для 8-, 16- и 32-битных операндов соответственно. Они различаются по коду операции И/ИЛИ по одному биту в команде. На рис. 5.21 приведены в основном 32-битные команды.

Для удобства мы разделили команды на несколько групп. Первая группа содержит команды, которые перемещают данные между частями машины: регистрами, памятью и стеком. Вторая группа содержит арифметические операции со знаком и без знака. Для умножения и деления 64-битное произведение или делимое хранится в двух регистрах: ЕАХ (младшие биты) и EDX (старшие биты).

Третья группа включает двоично-десятичную арифметику. Здесь каждый байт рассматривается как два 4-битных полубайта. Каждый полубайт содержит 1 десятичный разряд (от 0 до 9). Комбинации битов от 1010 до 1111 не используются. Таким образом, 16-битное целое число может содержать десятичное число от 0 до 9999. Хотя такая форма хранения неэффективна, она устраняет необходимость переделывать десятичные входные данные в двоичные, а затем обратно в десятичные для вывода. Эти команды используются для выполнения арифметических действий над двоично-десятичными числами. Они широко используются в программах на языке COBOL.

Логические команды и команды сдвига манипулируют битами в слове или байте. Существует несколько комбинаций.

Следующие две группы связаны с проверкой и сравнением и осуществлением перехода в зависимости от полученного результата. Результаты проверки и сравнения хранятся в различных битах регистра EFLAGS. Значок Jxx стоит вместо набора команд, которые совершают условный переход в зависимости от результатов предыдущего сравнения (то есть в зависимости от битов в регистре EFLAGS).

В Pentium II есть несколько команд для загрузки, сохранения, перемещения, сравнения и сканирования цепочек символов или слов. Перед этими командами может стоять специальный префиксный байт REP (repetition — повторение), который заставляет команду повторяться до тех пор, пока не будет выполнено определенное условие (например, пока регистр ЕСХ, значение которого уменьшается на 1 после каждого повторения, не будет равен 0). Таким образом, различные действия (перемещение, сравнение и т. д.) могут производиться над произвольными блоками данных.

Последняя группа содержит команды, которые не вошли ни в одну из предыдущих групп. Это команды перекодирования, команды управления, команды вводавывода и команды остановки процессора.

392 Глава 5. Уровень архитектуры команд

MOV DST, SRC

PUSH SRC

POP DST

XCHGDS1.DS2 LEA DST, SRC CMOV DST, SRC

ADD DST, SRC SUB DST, SRC MUL SRC IMUL SRC DIV SRC

IDV SRC

ADC DST, SRC SBB DST, SRC INC DST DEC DST NEG DST

DAA DAS

ААА

AAS ААМ AAD

AND DST, SRC OR DST, SRC XOR DST, SRC NOT DST

SAL/SARDST,# SHL/SHRDST, # ROL/ROR DST,# ROL/RORDST,#

TSTSRC1.SRC2

CMPSRC1.SRC2

Команды перемещения Перемещает SRC в DST Помещает SRC в стек

Выталкивает слово из стека и помещает его в DST

Меняет местами DS1 и DS2

Загружает действительный адрес SRC в DST Условное перемещение

Арифметические команды Складывает SRC и DST Вычитает SRC из DST Умножает EAX на SRC (без знака)

Умножает ЕАХ на SRC (со знаком)

Делит EDX:EAX на SRC (без знака)

Делит EDX:EAX на SRC (со знаком)

Складывает SRC с DST и прибавляет бит переноса

Вычитает DST и переносит из SRC

Прибавляет 1 к DST

Вычитает 1 из DST

Отрицает DST (вычитает DST из 0) Двоично-десятичные команды Десятичная коррекция

Десятичная коррекция для вычитания Коррекция кода ASCII для сложения Коррекция кода ASCII для вычитания Коррекция кода ASCII для умножения Коррекция кода ASCII для деления Логические команды

Логическая операция И над SRC и DST

Логическая операция ИЛИ над SRC и DST

Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ над SRC и DST

Замещение DST дополнением до 1 Команды сдвига/циклического сдвига Сдвиг DST влево/вправо на # битов Логический сдвиг DST влево/вправо на # битов Циклический сдвиг DST влево/вправо на # битов Циклический сдвиг DST по переносу на # битов Команды тестирования/сравнения

Операнды логической операции И, установка флагов Установка флагов на основе вычитания SRC1-SRC2

Рис. 5.21. Команды с целыми числами в Pentium И (начало)