КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |