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

MOV DX, BX




ADD DX, SI

ADD DX, 2

Очевидно, что использование вместо этих трех команд команды LEA дает существенный выигрыш по занимаемой командами памяти и ускорение выполнения операции вычисления смещения. В таблице 5 приведены дополнительные примеры правильного и неправильного использования команды LEA.

 

 

Таблица 5

Примеры использования команды LEA

Примеры правильного использования Примеры неправильного использования
LEA AX, [BX + 5] LEA DS, [BX + 5]
LEA BX, [BP + DI] LEA 0234h, [SI]
LEA CX, ES: [SI – 2] LEA DS: [BX], [BP + DI]
LEA DX, SS: [BX] LEA AL, [BP – 1]

 

    Команды LDS и LES загружают сегмент и смещение (указатель вида сегмент: смещение) из памяти по адресу, определяемому указанным адресным выражением, в фиксированные сегментные регистры и указанный регистр. Команда LDS загружает номер сегмента из памяти в сегментный регистр DS, а команда LES – в сегментный регистр ES. Обе команды загружают смещение из памяти в указанный 16-битный регистр. Форматы команд:

LDS < имя_регистра>, < адресное_выражение>

LES < имя_регистра>, < адресное_выражение>

Регистр для команд LDS и LES выбирается по таким же правилам, как и для команды LEA. Адресное выражение используется для определения места в памяти, где хранятся сегмент и смещение для загрузки в регистры.

    Ниже приведен фрагмент программы, который поясняет работу команд LDS и LES.

A DW 0001h, 0002h

B DW 0003h, 0004h

. . .

LDS SI, A               ; теперь в DS – 0002h, а в SI – 0001h

MOV BX, OFFSET B; в BX – смещение переменной B

LES DI, [BX]          ; теперь в ES – 0004h, а в DI – 0003h

 

Следует отметить, что указатель вида сегмент: смещение записывается в памяти в виде двух последовательно расположенных слов в обратном порядке: первое слово – это смещение, а второе – сегмент. Поэтому в примере в DS записывается 0002h, а не 0001h.

    В таблице 6 приведены примеры правильного и неправильного использования команд LDS и LES.

Таблица 6

Примеры использования команд LDS и LES

Примеры правильного использования Примеры неправильного использования
LDS AX, [BX + 0Ah] LDS DS, [SI + 1]
LES BP, [DI – 5] LES 0123h, [BX + DI]
LDS SI, [BX] LDS [BX], [BX]
LES DI, [BX + SI] LES AX, [SI + DI]

 

    Команда LAHF копирует младшие 8 бит регистра флагов в регистр AH. Команда не имеет операндов. В регистр AH копируются 5 флагов (SF, ZF, AF, PF, CF), а остальные 3 бита регистра AH имеют неопределенное значение и от этих бит не должно зависеть выполнение программы.

    Команда SAHF копирует содержимое регистра AH в младшие 8 бит регистра флагов. Команда не имеет операндов. Из регистра AH копируются флаги SF, ZF, AF, PF, CF. На другие флаги воздействие не оказывается.

    Арифметические команды позволяют выполнять такие действия как сложение, вычитание, умножение, деление, инкремент, декремент, изменение знака, а также расширение байта до слова и слова до двойного слова. Все арифметические команды оперируют целочисленными данными, а команды деления формируют целую часть от деления и остаток от деления. При использовании арифметических команд важное значение имеют флаги, которые могут воздействовать на выполнение команды и характеризуют результат ее выполнения

    Команда ADD – это команда сложения. Синтаксис команды, такой же, как и у команды MOV. Правила выбора операндов – такие же, как и для команды MOV, но сегментные регистры не могут являться операндами команды ADD. В приемник записывается результат сложения приемника с источником, по другому: приемник: = приемник + источник. При выполнении сложения может возникнуть переполнение – когда результат не помещается в приемник. В этом случае командой ADD устанавливается флаг CF. При равенстве суммы 0 устанавливается флаг ZF. Если сумма меньше нуля, т. е. старший бит результата равен 1, устанавливается флаг SF. Флаг PF устанавливается при четном числе единиц в результате. Флаг AF устанавливается, если при сложении возникает перенос из 3-го разряда в 4-й.

    Команда ADC (сложение с переносом) аналогична команде ADD, но на ее выполнение влияет значение флага CF – значение этого флага (0 или 1) добавляется к сумме, или приемник: = приемник + источник + CF. Это может использоваться для побайтового или пословного сложения чисел большой разрядности. Например, при помощи команды ADC можно сложить 64-битные целые числа, каждое из которых представлено 8 байтами. Флаги, устанавливаемые командой ADC – такие же, как и для команды ADD.

    Команда SUB – это команда вычитания. Ее синтаксис и правила выбора операндов такие же, как и для команды сложения ADD. Команда выполняет вычитание из значения приемника значение источника и записывает результат в приемник, иначе: приемник: = приемник – источник. Флаги, формируемые командой SUB, такие же, как и для команды ADD. Флаг CF устанавливается при возникновении заема из старшего разряда приемника, а флаг AF – при возникновении заема из 3-го разряда в 4-й.

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

    Команды 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 являются командами деления. Так же как и команды умножения команды деления бывают для знаковых чисел (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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...