Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Команда SBB. SUB WORD PTR N1, AX ; вычитание младших 16 бит. MOV AX, WORD PTR N2 + 2 . Команды MUL и IMUL. Команды DIV и IDIV




Команда SBB

Команда SBB (вычитание с займом) аналогична команде вычитания SUB, но на ее выполнение влияет значение флага CF – значение этого флага (0 или 1) вычитается из разности приемника и источника, или приемник: = приемник – источник – CF. Это может использоваться для побайтового или пословного вычитания чисел большой разрядности. Флаги, устанавливаемые командой SBB – такие же, как и для команды SUB.

Пример использования команд SUB и SBB для вычитания двух 32-битных целых чисел:

N1 DD 123456789            ; описание 32-битных переменных

N2 DD 987654321

. . .

MOV AX, WORD PTR N2

SUB WORD PTR N1, AX         ; вычитание младших 16 бит

MOV AX, WORD PTR N2 + 2      

SBB WORD PTR N1 + 1, AX   ; вычитание старших 16 бит

 

Команды MUL и IMUL

Команды MUL и IMUL – это команды умножения. Команда MUL рассматривает свои операнды как беззнаковые числа, а команда IMUL – как знаковые. Разновидности команд умножения связаны с тем, что правила машинного умножения для знаковых и беззнаковых чисел немного различаются. Использование команды MUL для умножения чисел со знаком может привести к неверному результату. Команду MUL можно использовать для умножения знаковых чисел, только в том случае, если эти числа положительные.

Каждая из команд MUL и IMUL может умножать 8-битные числа – при этом результат будет 16-битным, или 16-битные числа – при этом результат будет 32-битным (такой результат располагается в двух 16-битных регистрах). Синтаксис команд MUL и IMUL:

MUL < множитель>

IMUL < множитель>

При использовании 8-битного умножения множимое располагается в регистре AL, а множитель – в каком-либо 8-битном регистре (например, AH, BL, и т. д. ) или 8-битной ячейке памяти с прямой или косвенной формой адресации. Результат 8-битного умножения является 16-битным и располагается в регистре AX.

При использовании 16-битного умножения множимое располагается в регистре AX, а множитель – в каком-либо 16-битном регистре (например, BX, DX, и т. д. ) или 16-битной ячейке памяти с прямой или косвенной формой адресации. Результат 16-битного умножения является 32-битным и располагается в регистровой паре DX: AX – в регистре AX располагаются младшие 16 бит результата, а в регистре DX – старшие 16 бит результата.

При использовании в командах умножения адресных выражений с косвенной адресацией необходимо указать тип операнда (байт или слово) с помощью синтаксических конструкций “BYTE PTR” или “WORD PTR”. Используемый тип умножения (8-битное или 16-битное) определяется типом множителя (8-битный или 16-битный). Следует обращать внимание на то, в каких регистрах для каждого типа умножения хранятся данные и результат.

Когда результат умножения целиком не умещается в регистре AL (для 8-битного умножения) или в регистре AX (для 16-битного умножения) командами MUL и IMUL одновременно устанавливаются флаги CF и OF. Эта ситуация не является переполнением, так как произведение двух N-битных чисел всегда умещается в 2 * N-битную переменную. Флаги AF, PF, SF и ZF после выполнения команд умножения своего значения не меняют.

Пример использования команды IMUL для 8-битного и 16-битного умножения:

MOV AL, 15

IMUL AL                  ; AX: = AL * AL

MOV AX, 2000

MOV BX, 4000

IMUL BX                  ; DX: AX: = AX * BX

Пример использования команды MUL для 16-битного умножения с возникновением переполнения:

MOV AX, 400H

MUL AX          ; DX = 10H, AX = 0, устанавливаются CF и OF

 

Команды DIV и IDIV

Команды DIV и IDIV являются командами деления. Так же как и команды умножения команды деления бывают для знаковых чисел (IDIV) и для беззнаковых (DIV).

Для МП 8086 существует два типа деления – 32-битное (когда 32-битное делимое делится на 16-битный делитель и результат является 16-битным) и 16-битное (когда 16-битное делимое делится на 8-битный делитель и результат является 8-битным). Синтаксис команд DIV и IDIV:

DIV < делитель>

IDIV < делитель>

 

При использовании 32-битного деления делимое располагается в регистровой паре DX: AX (в регистре DX – старшие 16 бит делимого, а в регистре AX – младшие 16 бит), а делитель – в 16-битном регистре (например, BX, CX и т. д. ) или 16-битной ячейке памяти с прямой или косвенной формой адресации. Частное от деления (его целая часть) располагается в регистре AX, а остаток от деления – в регистре DX.

При использовании 16-битного деления делимое располагается в регистре AX, а делитель – в 8-битном регистре (например, BL, DH и т. д. ) или 8-битной ячейке памяти с прямой или косвенной формой адресации. Частное от деления записывается в регистр AL, а остаток – в регистр AH.

В командах деления тип деления (32-битное или 16-битное) определяется типом делителя (16-битный или 8-битный). При использовании косвенной формы адресации памяти необходимо применять синтаксические конструкции “BYTE PTR” или “WORD PTR” для указания типа делителя.

В ходе деления может возникнуть ситуация, когда результат деления не помещается в регистре AX (для 32-битного деления) или регистре AL (для 16-битного деления), а также при делении на 0. В этом случае процессором генерируется исключение переполнения при делении и управление от программы передается обработчику этого исключения. Обработчик исключения, как правило, выдает сообщение об ошибке и завершает выполнение программы с передачей управления операционной системе. Следует избегать подобных ситуаций, так как это может привести к потере данных.

Команды деления воздействуют на флаги AF, CF, OF, PF, SF и ZF в соответствии с назначением этих флагов.

Пример использования команды IDIV для выполнения 32-битного и 16-битного деления:

X DD 123456789     ; описание переменных

Y DW 9876

Z DB 123

. . .

MOV AX, WORD PTR X

MOV DX, WORD PTR X + 2

IDIV Y                       ; AX: = X div Y

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...