Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная по ЭВМ / 3-МУ_Асс-арифм.doc
Скачиваний:
15
Добавлен:
20.02.2016
Размер:
169.98 Кб
Скачать
    1. Команды деления

В области целых чисел под делением понимают получение сразу двух величин - неполного частного и остатка.

Деление целых без знака (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

При такой ошибке ПК прекращает выполнение программы.

    1. Изменение размера числа

В связи с особыми требованиями к размерам операндов описанных выше команд, часто возникает необходимость изменять размеры (типы) чисел, сохраняя при этом их величины, например, если требуется сложить слово с байтом, то сначала надо расширить байт до слова, не изменяя величину числа.

Если число беззнаковое, то для его расширения надо слева приписать нули. Например, если 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

    1. Оператор указания типа 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

Изменение типа имени локально, оно действует только в данной команде.

Соседние файлы в папке Контрольная по ЭВМ