Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Команда ADD требует двух операндов, как и команда MOV:
add o1,о2
Команда ADD складывает оба операнда и записывает результат в o1, предыдущее значение которого теряется. Точно так же работает команда вычитания – SUB:
sub o1,o2
Результат, o1-o2, будет сохранен в o1, исходное значение o1 будет потеряно.
Рассмотрим примеры использования инструкций ADD и SUB:
add eax,8; EAX = EAX + 8
sub ecx,ebp; ECX = ECX - EBP
add byte [number],4; добавляем значение 4 к переменной
; number размером в 1 байт (0-255)
sub word [number],4; number = number - 4 размером в 2 байта
; (диапазон значений 0-65535)
add dword [number],4; добавляем значение 00000004 к "number"
sub byte [number],al; вычитаем значение регистра AL из "number"
sub ah,al; АН = АН - AL
При работе с большими диапазонами чисел, чем могут поддерживать регистры в арифметических командах используется признак переноса – флаг CF.
Полезны для этого команды ADC (Add With Carry – сложение с переносом) и SBB (Subtract With Borrow – вычитание с займом):
adc o1,o2; o1 = о1 + о2 + CF
sbb o1,o2; o1 = o1 - о2 - CF
Эти команды работают так же, как ADD и SUB, но соответственно добавляют или вычитают флаг переноса CF.
В контексте арифметических операций очень часто используются так называемые пары регистров. Пара – это два регистра, использующихся для хранения одного числа. Часто используется пара EDX:EAX (или DX:AX) – обычно при умножении. Регистр АХ хранит младшие 16 битов числа, a DX – старшие 16 битов. Таким способом даже древний 80286 может обрабатывать 32-разрядные числа, хотя у него нет ни одного 32-разрядного регистра. Пример: пара DX:AX содержит значение 0xFFFF (АХ = 0xFFFF, DX = 0).
Добавим 8 к этой паре и запишем результат обратно в DX:AX:
mov ax,0xffff; AX = 0xFFFF
mov dx,0; DX = 0
add ax,8; AX = AX + 8
adc dx,0; добавляем 0 с переносом к DX
Первая команда ADD добавит 8 к регистру АХ. Полностью результат не помещается в АХ, поэтому его старший бит переходит в CF. Вторая команда добавит к DX значение 0 и значение CF. После выполнения ADC флаг CF будет добавлен к DX (DX теперь равен 1). Результат сложения 0xFFFF и 8 (0x10007) будет помещен в пару DX:AX (DX=0x1,AX=0x0007).
Процессор 80386+ может работать с 32-разрядными числами напрямую – безо всяких переносов:
mov eax,0xffff; ЕАХ = 0xFFFF
add eax,8; ЕАХ = ЕАХ + 8
После выполнения этих инструкций в ЕАХ мы получим 32-разрядное значение 0x10007. Для работы с 64-разрядными числами мы можем использовать пару EDX:EAX – точно так же, как мы использовали пару DX:AX.
Отрицательные целые числа в ПК представлены в так называемом дополнительном коде. Процесс отображения отрицательных чисел в дополнительный код иногда называют маппингом (mapping).
Один байт может содержать числа в диапазоне от 0 до 255. Код дополнения заменяет этот диапазон другим – от -128 до 127. Дополнительный код может быть расширен до 2 байтов (от 0 до 65535). Он будет охватывать диапазон чисел от -32768 до 32767. Если дополнительный код расширить до 4 байтов, то получим диапазон от -2147483648 до 2147483647. Во многих языках программирования именно этот диапазон используется для код целочисленного типа данных (integer).
Выполнять арифметические операции над отрицательными числами в дополнительном коде можно при помощи обычных команд ADD и SUB. Единственное отличие от операций с положительными числами – необходимо игнорировать установку флага переноса. При этом результат операции является истинным и представлен в дополнительном коде.
Механизм дополнительного кода ввели именно для того, чтобы при сложении и вычитании отрицательных чисел не приходилось выполнять дополнительных действий.
Отрицательные числа также могут использоваться при адресации памяти. Например, регистр ВХ содержит адрес, а нам нужен адрес предыдущего байта, но мы не хотим изменять значение регистра ВХ (предполагается, что процессор находится в реальном режиме):
mov ах,[bх-1]; поместить в АХ значение по адресу, который
; на единицу меньше, чем значение в ВХ
Значение -1 будет преобразовано в 0xFFFF, и инструкция будет выглядеть так:
mov ax,[bx+0xFFFF]
При вычислении адреса не учитывается флаг CF, поэтому мы получим адрес, на единицу меньший.
Дата публикования: 2014-11-28; Прочитано: 364 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!