КОМАНДА СЛОЖЕНИЯ С ПЕРЕНОСОМ ADC
КОМАНДА СЛОЖЕНИЯ ADD
НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ
ПРЯМАЯ АДРЕСАЦИЯ
Наиболее простой способ адресации – прямой, который реализован в большинстве известных процессоров. Однако, увеличение поля прямого адреса делает команды слишком длинными и не эффективными. Для XT прямой адрес равен 20 бит, а для AT он значительно больше. Разработанные в настоящее время режимы адресации направлены на следующие цели:
- определение адреса наименьшим числом бит;
- вычисление адреса команд относительно базы, а в командах перехода относительно текущей команды;
- вычисление адреса данных на основании выражений, элементы которых в процессе выполнения программы изменяются, что позволяет организовать удобный доступ к регулярным структурам данных.
Это операнд, записанный в виде константы, при трансляции программы этот операнд записывается в поле команды длиной в слово или байт, т. к. для обращения к операнду не требуется цикла обращения к памяти, а он выбирается непосредственно из поля команды – отсюда непосредственная адресация.
ADD AL,5
┌───────┬──┬─────┐
ADD AL,5 │ KOП │b │ 05 │
└───────┴──┴─────┘
A DW 0
ADD A,5
┌───────┬─┬─────────┬────────┬───────┐
│ KOП │w│post byte│adress A│ 00 05│
└───────┴─┴─────────┴───┴────┴───┴───┘
Команды сложения и вычитания являются базовыми при построении ЭВМ, и потому в алгоритме их выполнения заложено формирование всех признаков результата (6 признаков).
OF DF IF SF ZF AF PF CF
┌──┬──┬──┬──┬──┬──┬──┬──┐
ADD ОР1,ОР2 Сложение чисел со знаком │ F│ │ │ F│ F│ F│ F│ F│
└──┴──┴──┴──┴──┴──┴──┴──┘
ОР1:=ОР1+ОР2
ADD mem/reg,mem/reg
ADD AL,BL; AL= 35 = 23h = 0.0100011b +
; BL= -39 = -27h = 1.1011001b
----------
OF SF ZF AF PF CF 1.1111100b дк
┌──┬──┬──┬──┬──┬──┐ ----------
│ 0│ 1│ 0│ *│ 1│ 0│ 1.0000100b пк = -4h
└──┴──┴──┴──┴──┴──┘
AL= 100 = 64h = 0.1100100b +
BL= 100 = 64h = 0.1100100b
----------
1.1001000b перенос в знак =1
перенос из знака =0
OF SF ZF AF PF CF Флаги формируются в соответствии формирования
┌──┬──┬──┬──┬──┬──┐ чисел со знаком.
│ 1│ 1│ 0│ *│ 0│ 0│
└──┴──┴──┴──┴──┴──┘
Однако эта команда используется для сложения чисел без знака, флаги формируются аппаратно по тому же алгоритму и только программист может правильно интерпретировать результат, а именно: произошло переполнение или нет.
Сложение чисел без знака:
AL=150=96h=10010110b +
BL=150=96h=10010110b
---------------
1.00101100b = 44<>300
Флаги формируются по тому же принципу, а анализируется результат по другому.
OF SF ZF AF PF CF Т. к. программист предполагал, что склады-
┌──┬──┬──┬──┬──┬──┐ вает числа без знака, судить о переполне-
│ 1│ 0│ 0│ *│ 0│ 1│ нии надо по значению флага CF. В данном
└──┴──┴──┴──┴──┴──┘ случае CF = 1, произошло переполнение и
результат неверный.
ADC ОР1,ОР2
OP1 OP2 OP1 := OP1 + OP2 + CF
| |
v v
┌──┐ ┌───┴──┐ ┌─┴────┐
│СF│<- └┐ └─┘ ┌┘
└──┘ └┐ СУММАТОР ┌┘<────┐
│ └─────┬─────┘ │
│ │ │
└─────────────┼────────────┘
V
При этом новые значения флагов формируются точно также. Команда используется для сложения полей, превышающих слово, например двойное слово.
┌─────┬─────┐
+ └──┴──┴──┴──┘
┌─────┬─────┐
└──┴──┴──┴──┘
-----------------------------
┌─────┬─────┐ ┌─────┬─────┐
└──┴──┴──┴──┘ └──┴──┴──┴──┘
│ ┌──┐ │
└─┤СF├─┘
└──┘
A DD ?
B DD ?
C DD ?
MOV AX,word ptr A ; младшее слово
ADD AX,word ptr B ; 1-е сложение
MOV word ptr C,AX ; выполнено сложение младших слов
; полей
MOV AX,word ptr A+2; старшее слово
ADC AX,word ptr B+2; 2-е сложение
MOV word ptr C+2,AX; результат сложения в С
Этот пример показывает, как в 16-разрядной машине производится сложение операндов LONGINT.