- •Практическая работа 2 программирование арифметических задач
- •Цель работы
- •Условные обозначения
- •Команда пересылки
- •Команды сложения и вычитания
- •Команды умножения
- •Команды деления
- •Изменение размера числа
- •Оператор указания типа ptr
- •Безусловный переход
- •Команда сравнения
- •Команды условного перехода
- •Пример программы
- •Задания для самостоятельной работы
Практическая работа 2 программирование арифметических задач
-
Цель работы
Изучение команд, применяемых при решении арифметических задач (сложения, вычитания, умножения, деления знаковых и беззнаковых целых чисел, безусловных и условных переходов).
-
Условные обозначения
При описании команд используются следующие обозначения:
-
op1, op2 – операнды;
-
imm или im – непосредственный операнд (операнд, указанный в самой команде);
-
reg – регистр;
-
mem – память.
-
Команда пересылки
MOV op1, op2
Алгоритм: на место первого операнда пересылается (копируется) значение второго: ор1 := ор2. Флаги не меняются. Размеры операндов должны быть одинаковы.
Допустимые комбинации операндов перечислены в таблице 2.1
Таблица 2.1 - Допустимые комбинации операндов
ор1 |
ор2 |
reg |
im, reg, mem |
mem |
im, reg |
Запрещены пересылки:
-
из одной ячейки памяти в другую;
-
из одного сегментного регистра в другой;
-
непосредственного операнда в сегментный регистр;
-
адреса в сегментный регистр.
Обойти запреты можно, использовав промежуточный регистр.
-
Команды сложения и вычитания
В ПК делается различие между целыми числами без знака (неотрицательными) и со знаком. Знаковые числа записываются в дополнительном коде.
Сложение и вычитание беззнаковых и знаковых чисел производится по одним и тем же алгоритмам, при этом возможны особые случаи, когда настоящий (в математическом смысле) результат выходит за диапазон представимых чисел, и результат искажается. Этот факт фиксируется во флагах CF и OF.
Сложение: ADD op1, op2
Вычитание (subtract): SUB op1, op2
Алгоритм: ор1:=ор1ор2.
Размеры операндов должны быть одинаковыми. Допустимые комбинации операндов – такие же, как у команды пересылки (см. таблицу 2.1). Меняются флаги переноса CF, переполнения OF, знака SF нуля ZF, вспомогательного переноса AF и паритета PF.
Увеличение на 1 (increment): INC op
Уменьшение на 1 (decrement): DEC op
Операнд op может быть reg или mem. В отличие от команд сложения и вычитания указанные команды не меняют флаг переноса CF.
Изменение знака (negative): NEG op
Команда NEG рассматривает свой операнд как число со знаком и меняет его знак на противоположный: ор := -ор.
Операнд op может быть reg или mem. Меняются флаги, перечисленные при описании команды сложения.
Особый случай: если ор – байт и равен -128 (80h), то операнд не меняется (байтовое знаковое число +128 не существует). Аналогично для чисел другого размера, например, для чисел-слов: если значение операнда равно минимальному отрицательному числу -32768 (8000h), то команда не меняет операнд. В этом особом случае флаг OF получает значение 1 (при других операндах OF=0). При нулевом операнде флаг CF равен 0, при других 1. Флаги SF и ZF меняются, как обычно.
-
Команды умножения
Умножение беззнаковых и знаковых чисел выполняется по разным алгоритмам, в связи с чем имеются две команды умножения.
Умножение целых без знака (multiply): MUL ор
Умножение целых со знаком (integer multiply): IMUL ор
Операнд op может быть reg или mem (не может быть imm !!!). Команда воздействует на флаги CF и OF.
Регистры, которые используются в этих операциях, представлены в таблице 2.2.
Таблица 2.2 - Регистры, используемые в операциях умножения
Множимое |
Множитель |
Результат |
AL |
ор8 |
AX |
AX |
ор16 |
DX:AX |
EAX |
ор32 |
EDX:EAX |
Примечание - Обозначения ор8, ор16 и ор32 – соответственно операнды размером байт, слово и двойное слово.
Под результат умножения отводится в два раза больше места, чем под сомножители. Это связано с тем, что умножение n-значных чисел в общем случае дает произведение из 2n цифр. В то же время не всегда величине произведения нужен удвоенный формат. О фактической величине произведения судят по флагам. Если CF=OF=1 - произведение занимает двойной формат. Если CF=OF=0 - достаточен формат сомножителей. В последнем случае можно считать, что произведение байтов занимает только регистр AL, а произведение слов - только регистр АХ.