Команда DIV (divide - разделить) выполняет деление чисел без знака, а команда IDIV (integer divide - разделить целые числа) выполняет деление чисел со знаком. Эти команды имеют формат
DIV источник; Где источник - делитель размером в байт или слово,
IDIV источник; находящийся в регистре общего назначения или
в ячейке памяти.
Делимое должно иметь двойной размер; оно извлекается из регистра АХ (при делении на 8-битовое число) или из регистров DX и АХ (при делении на 16-битовое число). Результаты возвращаются следующим образом:
– если операнд-источник представляет собой байт, то частное возвращается в регистр AL, а остаток в регистр АН;
– если операнд-источник представляет собой слово, то частное возвращается в регистр АХ, а остаток - в регистр DX.
Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре-приемнике (AL или АХ), то микропроцессор генерирует прерывание типа 0 (деление на 0).
Переполнение результата деления возникает при следующих условиях:
– делитель равен 0;
– при делении байтов без знака, делимое, по меньшей мере, в 256 раз превышает делитель;
– при делении слов без знака, делимое, по меньшей мере, в 65 536 раз превышает делитель;
– при делении байтов со знаком частное лежит вне диапазона
-128 до +127;
– при делении слов со знаком частное лежит вне диапазона от -32768 до 32767.
Приведем несколько типичных примеров операций деления:
DIV BX; Разделить DX:AX на ВХ, без знака.
DIV MEM_BYTE; Разделить АХ на байт памяти, без знака.
IDIV DL; Разделить АН:AL на DL со знаком.
IDIV MEM WORD; Разделить DX:AX на слово памяти, со знаком.
Команды DIV и IDIV не позволяют прямо разделить на непосредственное значение, так как процессор не может определить тип данных. Число предварительно загружают в регистр или ячейку памяти, которые точно указывают тип данных числа. Например, команда
MOV BX,20; Загружает непосредственное данное в словный регистр,
DIV ВХ ; а здесь делится содержимое регистров DX и АХ на 20.
Команды умножения - MUL, IMUL
Команда MUL (multiply-умножить) умножает числа без знака, a IMUL (integer multiply-умножить) умножает целые числа со знаком. Множимое и множитель у обеих команд должны быть данные одного типа, то есть байты, слова, двойные слова и т. д.
Эти команды имеют следующий формат:
MUL источник; Где источник - регистр общего назначения,
IMUL источник; или ячейка памяти размером в байт или слово.
В качестве первого операнда (множимого), команды MUL и IMUL используют содержимое регистра AL (при операциях над байтами) или регистра АХ (при операциях над словами). Произведение имеет двойной размер и возвращается следующим образом:
– умножение байтов - возвращает 16-битовое произведение в регистры АН (старший байт) и AL (младший байт);
– умножение слов - возвращает 32- битовое произведение в регистры DX (старшее слово) и АХ (младшее слово).
То есть размер произведения n- битных сомножителей равен 2 n .
После исполнения команды MUL флаги CF и OF равны 0, если старшая половина произведения равна 0; в противном случае оба этих флага равны 1. После исполнения команды IMUL флаги CF и OF равны 0, если старшая половина произведения представляет собой лишь расширение знака младшей половины. В противном случае они равны 1.
Несколько примеров умножения:
MUL BX; Умножить ВХ на АХ без знака.
MUL MEM_BYTE; Умножить содержимое ячейки памяти на AL без знака.
IMUL DL; Умножить DL на AL со знаком.
IMUL MEM_WORD; Умножить ячейку памяти на АХ со знаком.
Команды MUL и IMUL не дозволяют в качестве операнда использовать непосредственное число. Перед умножением непосредственное число необходимо загрузить в регистр или в ячейку памяти.
Например: MOV DX,10; Непосредственное данное поместим в DX.
MUL DX; Умножаем содержимое регистра АХ на 10.
Дата: 2018-11-18, просмотров: 649.