Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Инструкции сложения ADD и вычитания SUB



Команда 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...