
- •Замковец с.В. Левин н.А. Попкова е.Я. Архитетура микропроцессоров
- •Удк 681.3.06
- •Классификация микропроцессоров по архитектуре
- •Архитектура микропроцессоров 80х86
- •2.1. Используемые типы данных
- •2.2. Регистры микропроцессоров
- •2.3. Режимы адресации
- •2.4. Управление стеками
- •2.5. Сегментная организация памяти
- •Система команд микропроцессоров
- •3.2.Команды передачи данных
- •Команды двоичной арифметики
- •Команды десятичной арифметики
- •Логические команды
- •Команды сдвигов
- •Команды обработки бит и байт
- •Команды обработки цепочек
- •Команды передачи управления
- •3.9.1. Команды условных переходов
- •3.9.2 Команды безусловных переходов
- •3.9.3 Команды вызова подпрограмм
- •3.9.4 Команды возврата из подпрограмм
- •4. Прерывания
- •4.1. Прерывания в реальном режиме
- •Защита по привилегиям
- •5.1. Определение уровней привилегий
- •Вычисления с плавающей запятой
- •6.1. Форматы чисел с плавающей запятой
- •6.3. Регистры сопроцессора
- •Mmx архитектура
- •7.1. Форматы представления данных
- •7.2. Арифметика с насыщением
- •7.3. Mmx регистры
- •7.4. Система команд mmx
- •1. Классификация микропроцессоров по архитектуре ... 8
- •2. Архитектура микропроцессоров 80х86 ………………...10
Команды двоичной арифметики
К командам двоичной арифметики в первую очередь относятся команды сложения. Имеется четыре различных команды сложения и первая из этих команд – команда ADD. При выполнении этой команды происходит сложение операндов, которые находятся в приемнике и источнике, и результат помещается в приемник.
add dst, src (dst) = (dst) + (src).
Имеются следующие форматы этой команды:
add reg/mem, imm;
add reg, reg/mem;
add reg/mem, reg;
add reg/mem16, imm8;
add reg,mem32, imm8.
В двух последних форматах размер непосредственного операнда меньше размера приемника и для получения правильного результата до проведения сложения этот операнд расширяется со знаком до размера приемника.
Команда сложения с переносом ADC отличается от команды ADD тем, что в этой команде к сумме источника и приемника прибавляется еще дополнительно значение флага переноса CF:
adc dst, src (dst) = (dst) + (src) + (CF)
Использование этой команды позволяет осуществить сложение операндов любого размера с соответствующим учетом переносов. Форматы этой команды аналогичны форматам команды ADD.
К командам сложения относится однооперандная команда инкремента INC, т.е. увеличения значения на 1:
inc dst (dst) = (dst) + 1.
Операндами в этой команде могут быть содержимое регистра или памяти:
inc reg/mem.
Последняя команда сложения – XADD осуществляет сложение и обмен. Формат этой команды выглядит следующим образом:
xadd r/m, r.
При выполнении этой команды источник заменяется приемником, а приемник – суммой источника и приемника.
Следующая подгруппа команд арифметики включает команды вычитания. Первая команда вычитания – команда SUB, при помощи которой осуществляется вычитание источника из приемника, а разность помещается на место приемника.
sub dst, src dst = (dst) – (src)
Имеются следующие форматы этой команды:
sub reg/mem, imm;
sub reg, reg/mem;
sub reg/mem, reg;
sub reg/mem16, imm8;
sub reg/mem32, imm8.
В двух последних командах размер непосредственного операнда меньше размера приемника и для получения правильной разности до осуществления вычитания источник расширяется со знаком до соответствующего размера.
Команда вычитания с заемом SBB отличается от команды SUB тем, что кроме вычитания источника из приемника осуществляется дополнительно вычитание значение флага переноса CF, т.е. осуществляется следующая операция:
sbb dst, src dst = (dst) – (src) – (CF).
При помощи этой команды реализуется вычитание чисел любого размера. Формат команды SBB аналогичен формату команды SUB.
К командам вычитания относится также однооперандная команда декремента DEC, при помощи которой осуществляется уменьшение операнда на 1:
dec dst dst = (dst) – 1.
Операнд может находиться в регистре или ячейке памяти:
dec reg/mem.
Команда образования дополнительного кода числа NEG имеет следующее представление:
neg dst dst = 0 – (dst)
а операнд может находиться в регистре или ячейке памяти:
neg reg/mem.
Команда сравнения CMP похожа на команду вычитания SUB и имеет аналогичные форматы:
cmp dst, src.
Отличие команды сравнения от команды вычитания заключается в том, что результат этой команды никуда не записывается, а эта команда используется только для выработки соответствующих флагов.
Среди команд умножения имеются команды умножения знаковых и беззнаковых чисел. Однооперандная команда умножения MUL беззнаковых чисел производит умножение содержимого аккумулятора на адресуемый в команде операнд:
mul src.
Множитель src может быть содержимым регистра или ячейки памяти. В случае умножения байт один множитель находится в регистре AL, а 16-разрядное произведение записывается в регистры AH-AL, т.е. в регистр AX. Если происходит умножение 16-разрядных операндов, то один сомножитель находится в источнике src, а второй – в регистре AX. В этом случае 32-разрядное произведение будет располагаться в регистрах DX-AX. Наконец, при выполнении умножения 32-разрядных операндов один сомножитель находится в источнике src, а второй – в регистре EAX. 64-разрядное произведение будет располагаться в регистрах EDX-EAX.
Команды умножения знаковых чисел IMUL (при этом умножении старшие знаковые разряды не участвуют непосредственно в самом умножении, а используются только для формирования знака произведения) обладают более широкими возможностями по сравнению с командой умножения беззнаковых чисел, допуская задание одного, двух или трех операндов.
Однооперандная команда IMUL полностью идентична описанной команде MUL. Множитель src может быть содержимым регистра или ячейки памяти и имеет разрядность 8, 16 или 32 разряда.
Двухоперандная команда IMUL имеет следующий вид:
imul reg, src
и при выполнении этой команды производится умножение содержимого регистра общего назначения на содержимое источника, которым может быть регистр или ячейка памяти, а также непосредственное значение. Эта команда имеет следующий формат:
imul reg16, imm8;
imul reg16, imm16;
imul reg32, imm8;
imul reg32, imm32;
imul reg16, reg/mem16;
imul reg32, reg/mem32.
При выполнении данной команды произведение помещается в регистр-приемник, а старшая часть результата произведения теряется.
В трехоперандной команде IMUL
imul dst, src,imm dst = (src) x imm
приемником может быть регистр общего назначения, а источником – регистр или ячейка памяти. Формат этой команды имеет следующий вид:
imul reg16,reg/mem16,imm8/16;
imul reg32, reg/mem32, imm8/32.
Таким образом, при выполнении данной команды умножаются второй и третий операнды (константа-байт расширяется со знаком), а произведение помещается на место первого операнда, при этом старшая часть произведения теряется.
Аналогично командам умножения команды деления также могут быть знаковыми и беззнаковыми. Очевидно, что делимое должно иметь двойную длину, а результатом выполнения операции являются частное и остаток.
Команда деления беззнаковых чисел имеет следующий формат:
div src
и эта команда осуществляет деление аккумулятора и его расширения на адресуемый делитель src. Если размер делителя равен 1 байту, то делимое находится в регистрах AH-AL; если размер делителя равен слову, то делимое находится в регистрах DX-AX, а если размер делителя равен двойному слову, то делимое располагается в регистрах EDX-EAX. При выполнении команды частное формируется в аккумуляторе, а остаток – в расширении аккумулятора. Нецелое частное округляется до целого путем отбрасывания дробной части результата.
Команда деления знаковых чисел IDIV осуществляет такие же действия, как и команда DIV, необходимо только иметь ввиду, что все операнды и результаты представлены в дополнительном коде.