Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




В языке Ассемблера

Лекция 11. Команды целочисленной арифметики

11.1. Арифметические команды сложения и вычитания

Процессор 80386 не содержит математического сопроцессора, поэтому мы рассмотрим только целочисленную арифметику, которая полностью поддерживается процессором 80386. Каждая арифметическая команда изменяет регистр признаков.

Команда 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-12-07; Просмотров: 495; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.006 сек.