 
        
        - •Лабораторная работа 5 программирование арифметических задач
- •Цель работы
- •Условные обозначения
- •Команда пересылки
- •Команды сложения и вычитания
- •Команды умножения
- •Команды деления
- •Изменение размера числа
- •Оператор указания типа ptr
- •Пример программы
- •Include io.Asm ; подключение макроса io.Asm
- •Задания для самостоятельной работы
Лабораторная работа 5 программирование арифметических задач
- 
Цель работы
Изучение команд, применяемых при решении арифметических задач (сложения, вычитания, умножения, деления знаковых и беззнаковых целых чисел).
- 
Условные обозначения
При описании команд используются следующие обозначения:
- 
op1, op2 – операнды; 
- 
imm или im – непосредственный операнд (операнд, указанный в самой команде); 
- 
reg – регистр; 
- 
mem – память. 
- 
Команда пересылки
MOV op1, op2
Алгоритм: на место первого операнда пересылается (копируется) значение второго: ор1 := ор2. Флаги не меняются. Размеры операндов должны быть одинаковы.
Допустимые комбинации операндов перечислены в таблице 5.1
Таблица 5.1 - Допустимые комбинации операндов
| ор1 | ор2 | 
| reg | im, reg, mem | 
| mem | im, reg | 
Запрещены пересылки:
- 
из одной ячейки памяти в другую; 
- 
из одного сегментного регистра в другой; 
- 
непосредственного операнда в сегментный регистр; 
- 
адреса в сегментный регистр. 
Обойти запреты можно, использовав промежуточный регистр или стек.
- 
Команды сложения и вычитания
В ПК делается различие между целыми числами без знака (неотрицательными) и со знаком. Знаковые числа записываются в дополнительном коде.
Сложение и вычитание беззнаковых и знаковых чисел производится по одним и тем же алгоритмам, при этом возможны особые случаи, когда настоящий (в математическом смысле) результат выходит за диапазон представимых чисел, и результат искажается. Этот факт фиксируется во флагах CF и OF.
Сложение: ADD op1, op2
Вычитание (subtract): SUB op1, op2
Алгоритм: ор1:=ор1ор2.
Размеры операндов должны быть одинаковыми. Допустимые комбинации операндов – такие же, как у команды пересылки (см. таблицу 5.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.
Регистры, которые используются в этих операциях, представлены в таблице 5.2.
Таблица 5.2 - Регистры, используемые в операциях умножения
| Множимое | Множитель | Результат | 
| AL | ор8 | AX | 
| AX | ор16 | DX:AX | 
| EAX | ор32 | EDX:EAX | 
Примечание - Обозначения ор8, ор16 и ор32 – соответственно операнды размером байт, слово и двойное слово.
Под результат умножения отводится в два раза больше места, чем под сомножители. Это связано с тем, что умножение n-значных чисел в общем случае дает произведение из 2n цифр. В то же время не всегда величине произведения нужен удвоенный формат. О фактической величине произведения судят по флагам. Если CF=OF=1 - произведение занимает двойной формат. Если CF=OF=0 - достаточен формат сомножителей. В последнем случае можно считать, что произведение байтов занимает только регистр AL, а произведение слов - только регистр АХ.
