- •Практическая работа 2 программирование арифметических задач
- •Цель работы
- •Условные обозначения
- •Команда пересылки
- •Команды сложения и вычитания
- •Команды умножения
- •Команды деления
- •Изменение размера числа
- •Оператор указания типа ptr
- •Безусловный переход
- •Команда сравнения
- •Команды условного перехода
- •Пример программы
- •Задания для самостоятельной работы
-
Команды деления
В области целых чисел под делением понимают получение сразу двух величин - неполного частного и остатка.
Деление целых без знака (divide): DIV ор
Деление целых со знаком (integer divide): IDIV ор
Операнд op может быть reg или mem (не может быть imm !!!). Команды не изменяют флаги.
Регистры, применяемые в этих операциях, приведены в таблице 2.3.
Таблица 2.3 - Регистры, используемые в операциях деления
Делимое |
Делитель |
Неполное частное |
Остаток |
AX |
ор8 |
AL |
AH |
DX:AX |
ор16 |
AX |
DX |
EDX:EAX |
ор32 |
EAX |
EDX |
Размер делимого (числителя) в два раза больше делителя (знаменателя) и обоих результатов.
При выполнении команды деления возможно появление ошибки с названием "деление на 0 или переполнение". Она возникает в двух случаях:
-
делитель равен 0 (op=0);
-
неполное частное не вмещается в отведенное ему место (регистр AL, АХ или ЕАХ), например, при делении 600 на 2:
MOV AX, 600
MOV BH, 2
DIV ВН ; частное = 300, но 300 не вмещается в AL
При такой ошибке ПК прекращает выполнение программы.
-
Изменение размера числа
В связи с особыми требованиями к размерам операндов описанных выше команд, часто возникает необходимость изменять размеры (типы) чисел, сохраняя при этом их величины, например, если требуется сложить слово с байтом, то сначала надо расширить байт до слова, не изменяя величину числа.
Если число беззнаковое, то для его расширения надо слева приписать нули. Например, если AL=32=20h, то AX=0020h. Реализуется это записью 0 в левую часть регистра АХ, т. е. в регистр АН.
Расширение знакового числа заключается в приписывании к нему слева нулей, если число неотрицательно, или единиц, если число отрицательно. Другими словами, расширение со знаком заключается в дублировании слева знакового бита числа. Это выполняют команды расширения знаковых чисел (таблица 2.4).
Таблица 2.4 - Команды расширения знаковых чисел
Команда |
Действие |
Исходный регистр |
Регистр после расширения числа |
CBW (convert byte to word) |
байт слово |
AL |
AX |
CWD |
слово двойное слово |
AX |
DX:AX |
CWDE |
слово расширенное двойное слово |
AX |
EAX |
CDQ |
двойное слово учетверенное слово |
EAX |
EDX:EAX |
-
Оператор указания типа ptr
Размер величины определяется по типу операндов, участвующих в команде:
MOV ВН, 0 ; пересылка байта (ВН - байтовый регистр)
MOV SI, 0 ; пересылка слова (SI - регистр размером в слово)
Здесь по второму операнду (0) нельзя определить, какого он размера: нуль может быть и байтом (00h), и словом (0000h), определение типа осуществляется по первому операнду.
Когда ни по одному операнду косвенно нельзя определить размер пересылаемой величины, тип хотя бы одного из операндов должен быть указан явно. Для этого введен оператор указания типа PTR (pointer - указатель):
<тип> PTR <выражение>
где:
<тип> - стандартный (byte, word … );
<выражение> - константа или адрес.
Оператор PTR применяется также, когда надо локально, то есть в пределах одной команды, изменить тип операнда.
ПРИМЕР
BYTE PTR 0 ; - это нуль как байт
WORD PTR 0 : - это нуль как слово
ПРИМЕР
Записать нуль в первый байт переменной Z, объявленной как слово:
Z DW 1234h ; Z : 34h, Z+1: 12h
Нуль должен быть записан в байт, в котором находится величина 34h. Сделать это командой MOV Z, 0 нельзя, т. к. по ней нуль запишется в оба байта ( имя Z описано в директиве DW). Нужно, чтобы ассемблер рассматривал Z как имя байта. Такое изменение типа имени позволяет сделать оператор PTR:
MOV BYTE PTR Z, 0 ; Z: 00h, Z+1: 12h
Изменение типа имени локально, оно действует только в данной команде.